共计 3049 个字符,预计需要花费 8 分钟才能阅读完成。
一、docker commit 定制镜像
不要应用 docker commit 定制镜像,定制镜像应该应用 Dockerfile 来实现
在之前的例子中,咱们所应用的都是来自于 Docker Hub 的镜像。间接应用这些镜像是能够满足肯定的需要,但有时候咱们就须要定制本人的镜像。
$ docker run --name webserver -d -p 80:80 nginx
$ docker exec -it webserver bash
root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit
exit
// 查看变动
$ docker diff webserver
当初咱们定制好了变动,咱们心愿能将其保留下来造成镜像。
而 Docker 提供了一个 docker commit 命令,能够将容器的存储层保留下来成为镜像。换句话说,就是在原有镜像的根底上,再叠加上容器的存储层,并形成新的镜像。当前咱们运行这个新镜像的时候,就会领有原有容器最初的文件变动。
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
$ docker commit webserver lihaixing/docker-nginx:v1
sha256:405bcabb583a2f06fece0c69543eac1fa2e94d84b2c2bf1858ff00cb74b5aec4
// 镜像还在本地,看一下
$ docker image ls lihaixing/docker-nginx
$ docker run --name webserver2 -d -p 81:80 lihaixing/docker-nginx:v1
此外,应用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像
就是除了制作镜像的人晓得执行过什么命令、怎么生成的镜像,他人基本无从得悉。而且,即便是这个制作镜像的人,过一段时间后也无奈记清具体的操作。这种黑箱镜像的保护工作是十分苦楚的。
二、Dockerfile 定制镜像
从方才的 docker commit 的学习中,咱们能够理解到,镜像的定制实际上就是定制每一层所增加的配置、文件。
如果咱们能够把每一层批改、装置、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无奈反复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
Dockerfile 指令介绍 …..
1. FROM 指定根底镜像
指定 根底镜像,因而一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令,如果不依赖任何镜像
// 这个镜像是虚构的概念,并不理论存在,它示意一个空白的镜像。FROM scratch
...
在 Docker Hub 上有十分多的高质量的官网镜像,有能够间接拿来应用的服务类的镜像,如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;
也有一些不便开发、构建、运行各种语言利用的镜像,如 node、openjdk、python、ruby、golang 等。
2. run 命令
RUN 指令是用来执行命令行命令的。因为命令行的弱小能力,RUN 指令在定制镜像时是最罕用的指令之一
- shell 格局:RUN < 命令 >,
-
exec 格局:RUN [“ 可执行文件 ”, “ 参数 1 ”, “ 参数 2 ”]
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
3. CMD 容器启动命令
- shell 格局:CMD < 命令 >
- exec 格局:CMD [“ 可执行文件 ”, “ 参数 1 ”, “ 参数 2 ″…]
- 参数列表格局:CMD [“ 参数 1 ”, “ 参数 2 ″…]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
4. ENTRYPOINT
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param
5. ENV 设置环境变量
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ENV NODE_VERSION 7.2.0
ENV VERSION=1.0 DEBUG=on NAME="Happy Feet"
ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
&& grep "node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs
6. ARG 构建参数
构建参数和 ENV 的成果一样,都是设置环境变量。
所不同的是,ARG 所设置的构建环境的环境变量,在未来容器运行时是不会存在这些环境变量的。
Dockerfile 中的 ARG 指令是定义参数名称,以及定义其默认值。该默认值能够在构建命令 docker build 中用 –build-arg < 参数名 >=< 值 > 来笼罩。
灵便的应用 ARG 指令,可能在不批改 Dockerfile 的状况下,构建出不同的镜像。
ARG 指令有失效范畴,如果在 FROM 指令之前指定,那么只能用于 FROM 指令中。
ARG < 参数名 >[=< 默认值 >]
ARG DOCKER_USERNAME=library
FROM ${DOCKER_USERNAME}/alpine
RUN set -x ; echo ${DOCKER_USERNAME} // 有效
3. docker build 输入镜像
docker build [OPTIONS] PATH | URL | –
Build an image from a Dockerfile
docker build -t mynginx .
docker build -t hello-world https://github.com/docker-library/hello-world.git#master:amd64/hello-world
docker build http://server/context.tar.gz
docker build - < Dockerfile
// 后者
cat Dockerfile | docker build -
docker build - < context.tar.gz