Docker(7)-定制镜像
要定制docker镜像,我们需要一个特殊的文件:Dockerfile。通过它,我们可以安装软件以及添加其他我们希望包含到自定义镜像中的修改。
一般我们会把Dockerfile放在一个空的目录中, 因为存放Dockerfile的目录下面的任何文件和子目录都将被包含到新镜像中。
定制镜像步骤:
- 创建一个Dockerfile以描述如何构建镜像
- 执行docker build命令
例如,我们用编辑器打开Dockerfile,并输入以下内容:
#Hello World container image FROM ubuntu:16.04 CMD["echo", "Hello World"]
接下来我们用docker build命令来构建镜像,并将其命名为custom_image:
docker build -t custom_image .
Dockerfile由一系列指令构成,并且具有简单的结构。其中,任何在前面加上#符号的行都是注释。
一些常用的指令:
- FROM - 指定源镜像,我们将基于它来构建我们的镜像
- CMD - 运行时指令,容器启动时运行的命令。在上面的例子中,当我们以custom_image为镜像来运行容器时,echo命令就会被执行,"Hello World"作为参数传给了它。需要注意的是,每个Dockerfile只能有一个CMD指令,当包含多条CMD指令时,只有最后一条会被执行
- RUN - 构建时指令,常用于安装软件
- ENV - 指定容器中的环境变量
- VOLUME - 用于在容器启动时设置卷
下面我们来一起看一个简单的构建web server镜像的Dockerfile:
#Apache web server image FROM ubuntu:16.04 RUN apt-get update RUN apt-get install -y apache2 EXPOSE 80 CMD["apachectl", "start"]
RUN作为构建时指令,我们可以使用多条RUN指令来安装多个软件。这样虽然看起来很美观,但是镜像是分层构建的,而每一条RUN指令就代表了一层,层数越多,镜像也就越臃肿。我们可以使用如下语句来最小化镜像文件:
RUN apt-get update && apt-get install -y apache2
还记得我们之前说过“可以使用具有EXPOSE指令的Dockerfile和docker run命令的-P选项将容器上的端口公开到外面”的方法吗?在这个例子中我们就是这么做的,当我们使用-P选项运行容器时,docker会把容器中的80端口映射到主机上一个随机端口上。例如:
docker run -d -P apacheserver
凡心所向,素履以往,生如逆旅,一苇以航。