1. 初识 Dockerfile
我们在本地新建一个目录,编辑一个名为 Dockerfile 的文件,注意文件名大小写。
mkdir -p ~/docker/nginx/cd ~/docker/nginx
vim Dockerfile
FROM ubuntuMAINTAINER my_name myemail@domain.comRUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt update >/dev/null 2>&1
RUN apt install nginx -y >/dev/null 2>&1EXPOSE 80
将代码保存下来,尝试构建镜像。 在当前 Dockerfile 文件所在目录执行如下命令:
docker build --network=host -t ubuntu-nginx:v1 .
--network=host
使用宿主机的网络连接代理容器的网络(在一些情况下,容器可能无法顺畅地连接外网)。
-t ubuntu-nginx:v1
指定生产的镜像名称为 ubuntu-nginx ,版本号为 v1。
2. 镜像构建过程
我们执行 docker build --network=host -t ubuntu-nginx:v1 .
命令,看看在构建过程中做了哪些操作:
[user@centos8 nginx]$ docker build --network=host -t ubuntu-nginx:v1 .Sending build context to Docker daemon 2.56kBStep 1/7 : FROM ubuntu
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
---> 1d622ef86b13
Step 2/7 : MAINTAINER my_name myemail@domain.com
---> Running in 4eec6e3094f0Removing intermediate container 4eec6e3094f0
---> 6679d1c204e3
Step 3/7 : RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
---> Running in 84d38c20d8c4Removing intermediate container 84d38c20d8c4
---> 83f29f7b055a
Step 4/7 : RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
---> Running in 763e4493d93fRemoving intermediate container 763e4493d93f
---> 6297f20605d9
Step 5/7 : RUN apt update >/dev/null 2>&1
---> Running in 2665a7e5a2e9Removing intermediate container 2665a7e5a2e9
---> fdfed940ca4d
Step 6/7 : RUN apt install nginx -y >/dev/null 2>&1
---> Running in 722a9a544643Removing intermediate container 722a9a544643
---> 6ee76f7df9e5
Step 7/7 : EXPOSE 80
---> Running in a12ed3216ee0Removing intermediate container a12ed3216ee0
---> 7cf64279ba98
Successfully built 7cf64279ba98Successfully tagged ubuntu-nginx:v1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
结合之前讲到的 docker commit 命令,不难理解 Dockerfile 就是将我们在文件中书写的构建指令,一层一层从 FROM 指定的基础镜像使用临时容器过渡,逐层叠加起来最终生成目标镜像。
使用 docker history ubuntu-nginx:v1
命令可以验证我们的想法:
[user@centos8 nginx]$ docker history ubuntu-nginx:v1
IMAGE CREATED CREATED BY SIZE COMMENT
7cf64279ba98 21 minutes ago /bin/sh -c 6ee76f7df9e5 21 minutes ago /bin/sh -c apt install nginx -y >/dev/null 2… 59.2MB
fdfed940ca4d 21 minutes ago /bin/sh -c apt update >/dev/null 2>&1 21.4MB
6297f20605d9 21 minutes ago /bin/sh -c sed -i 's/security.ubuntu.com/mir… 2.76kB
83f29f7b055a 21 minutes ago /bin/sh -c sed -i 's/archive.ubuntu.com/mirr… 2.76kB
6679d1c204e3 21 minutes ago /bin/sh -c 1d622ef86b13 2 weeks ago /bin/sh -c <missing> 2 weeks ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 2 weeks ago /bin/sh -c set -xe && echo '<missing> 2 weeks ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 1.01MB<missing> 2 weeks ago /bin/sh -c
3. Dockerfile 的结构
- 基础镜像信息;
- 维护者信息;
- 镜像操作指令;
- 容器启动时指令。
我们可以将 Dockerfile 理解为一个由上往下执行指令的脚本文件。 当我们调用构建命令,通过我们给出的 Dockerfile 构建镜像时,Docker 按照 指令顺序进行对应的操作。
4. 小结
Dockerfile 是熟练掌握 Docker 的必备技能,它的优点有很多:
下一节,我们将深入学习 Dockerfile 常用的构建指令。