Dockerfile
是一个文本文件,其内包含了一条条的指令Instruction
,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。Dockerfile
定制镜像,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这里我们以制作nginx镜像为例子,首先我们创建一个自定义nginx目录,然后创建Dockerfile文件。
mkdir mynginx
cd mynginx
touch Dockerfile
然后在Dockerfile
进行编辑,替换原始的nginx页面内容
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
关于上面中的命令FROM
和RUN
后面我们会进行详细讲解。
编译Dockerfile
mgtv@ubuntu:~/mynginx$ sudo docker build -t nginx:V1 .
[sudo] password for mgtv:
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 62f816a209e6
Step 2/2 : RUN echo '<h1>hello,Dcoker!</h1>' > /usr/share/nginx/html/index.html
---> Running in 24c99f45946b
Removing intermediate container 24c99f45946b
---> 2010f87c2c59
Successfully built 2010f87c2c59
Successfully tagged nginx:V1
-t
: 镜像的名字及标签,通常 name:tag
或者 name
格式;可以在一次构建中为一个镜像设置多个标签。.
号,其实是在指定镜像构建过程中的上下文环境的目录查看制作好的ngnix
镜像
mgtv@ubuntu:~/mynginx$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx V1 2010f87c2c59 2 minutes ago 109MB
ubuntu latest 4c108a37151f 3 weeks ago 64.2MB
运行新的镜像,打开地址:ip:8081
即可看到最新修改之后的效果
sudo docker run --name ngnix_v1 -d -p 8081:80 nginx:V1
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行 了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并 且必须是第一条指令。
FROM nginx
Docker 还存在一个特殊的镜像,名为 scratch 。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
FROM scratch
我们设置了镜像的作者后,可以通过 docker inspect
命令查看镜像的信息,里面包含有作者信息。
命令格式如下:
MAINTAINER <name>
例如我们创建Dockerfile内容如下:
FROM nginx
MAINTAINER sutune@qq.com
编译之后查看镜像信息
docker@default:~/mynginx$ docker build -t nginx:sutune . #编译镜像
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 98ebf73aba75
Step 2/2 : MAINTAINER sutune@qq.com
---> Running in 23ebc293468b
Removing intermediate container 23ebc293468b
---> 4aaf6df34e72
Successfully built 4aaf6df34e72
Successfully tagged nginx:sutune
docker@default:~/mynginx$ docker inspect nginx:sutune #查看镜像信息
返回内容会比较多,我们截取部分查看,从返回的内容中找到Author
对应的值,我们可以看到设置的作者信息已经生效。
"DockerVersion": "18.06.1-ce",
"Author": "sutune@qq.com",
用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image
基本信息中可以查看,命令格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL version="1.0" description="nginx服务定制" #示例
使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
RUN 指令是用来执行命令行命令的。由于命令行的强大能力, RUN 指令在定制 镜像时是最常用的指令之一。其格式有两种:
RUN <命令>
,就像直接在命令行中输入的命令一样。刚才写的 Dockrfile 中的 RUN 指令就是这种格式。RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
RUN ["可执行文件", "参数1", "参数2"]
,这更像是函数调用中 的格式。&&
将命令串联起来,FROM debian:jessie
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/r
edis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-component
s=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
命令的最后--auto-remove $buildDeps
添加了清理工作的命令,删除了为了编译构建 所需要的软件,清理了所有下载、展开的文件,并且还清理了 apt 缓存文件。