DockerFile 介绍
dockerfile是用来构建docker镜像的文件,是命令参数脚本
- 构建步骤:
- 编写
dockerfile文件 -
docker build构建成为一个镜像 -
docker run运行镜像 -
docker push发送镜像(DockerHub、阿里云镜像)
- 编写
-
查看官方镜像文件的构建
DockerFile构建过程
- 基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 指令从上到下顺序执行
-
#表示注释 - 每一个指令都会创建提交一个新的镜像层,并提交!

-
dockerfile是面向开发的,要发布项目、做镜像需要编写dockerfile文件。 -
DockerFile:构建文件,定义了一切的步骤,源代码 -
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。 -
Docker容器:容器就是镜像运行起来提供服务。
DockerFile的指令
1. FROM # 基础镜像,一切从这里开始构建
2. MAINTAINER # 镜像作者:姓名+邮箱
3. RUN # 镜像构建的时候需要运行的命令
4. ADD # 步骤。(tomcat镜像的压缩包就是一种添加内容)
5. WORKDIR # 镜像的工作目录
6. VOLUME # 挂载的目录
7. EXPOSE # 暴露端口配置
8. CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 (替换)
9. ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以直接追加命令 (追加)
10. ONBUILD # 当构建一个被继承 DockerFile ,这个时候就会运行 ONBUILD 的指令,是一种触发指令
11. COPY # 类似ADD命令,将我们的文件拷贝到镜像中
12. ENV # 构建的时候设置环境变量

CMD 和 ENTRYPOINT 的区别:
-
CMD# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 (替换) -
ENTRYPOINT# 指定这个容器启动的时候要运行的命令,可以直接追加命令(追加)
实战测试:
-
centos7镜像构建
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20200504" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-05-04 00:00:00+01:00"
CMD ["/bin/bash"]
-
Docker Hub中 99%的镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建。 -
FROM scratch
官方说明:该镜像是一个空的镜像,可以用于构建busybox等超小镜像,可以说是真正的从零开始构建属于自己的镜像。要知道,一个官方的ubuntu镜像有60MB+,CentOS镜像有70MB+
可以把一个可执行文件扔进来直接执行 - 注意:
scratch不可以被pull -
FROM scratch专门用于构建最小镜像,直接pull会报以下错误,scratch是一个保留名称
[root@VM-0-6-centos ~]# docker pull scratch
Using default tag: latest
Error response from daemon: 'scratch' is a reserved name
- 如何制作大小为 0 的镜像
既然scratch不能被拉取,如何做到docker image ls看到一个0字节的镜像
官方给出了下面方法:
tar cv --files-from /dev/null | docker import - scratch
[root@VM-0-6-centos /]# tar cv --files-from /dev/null | docker import - scratch
sha256:ca0b4798edfafb22179f11d84493611112df0cdfbd1bd7c592c67f30a14a3e6f
[root@VM-0-6-centos /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
scratch latest ca0b4798edfa 8 seconds ago 0B
创建一个自己的 centos
- 新建dockerfile-centos文件
[root@VM-0-6-centos ceshi]# vi dockerfile-centos
- 编写dockerfile文件
FROM centos # 基础镜像是官方原生的centos
MAINTAINER yj<yj@qq.com> # 作者
ENV MYPATH /usr/local # 配置环境变量的目录
WORKDIR $MYPATH # 将工作目录设置为 MYPATH
RUN yum -y install vim # 给官方原生的centos 增加 vim指令
RUN yum -y install net-tools # 给官方原生的centos 增加 ifconfig命令
EXPOSE 80 # 暴露端口号为80
CMD echo $MYPATH # 输出下 MYPATH 路径
CMD echo "-----end-----"
CMD /bin/bash # 启动后进入 /bin/bash
- 构建镜像文件
docker build -f dockerfile-centos -t mycentos:1.0 .
注意带上版本号,否则每次都回去找最新版latest
[root@VM-0-6-centos ceshi]# docker build -f dockerfile-centos -t mycentos:1.0 .
Sending build context to Docker daemon 4.096kB
Step 1/10 : FROM centos
---> 300e315adb2f
Step 2/10 : MAINTAINER yj<yj@qq.com>
---> Running in 6026cec2776c
Removing intermediate container 6026cec2776c
---> 60feb235dd11
Step 3/10 : ENV MYPATH /usr/local
---> Running in 9e7149e0dc2c
Removing intermediate container 9e7149e0dc2c
---> c08d48a4db30
Step 4/10 : WORKDIR $MYPATH
---> Running in a11c3f9f23d5
Removing intermediate container a11c3f9f23d5
---> 1180ba69b198
Step 5/10 : RUN yum -y install vim
---> Running in 8973448d3648
Step 10/10 : CMD /bin/bash
---> Running in 104b3b2d2b4f
Removing intermediate container 104b3b2d2b4f
---> 201f0cb357f9
Successfully built 201f0cb357f9
Successfully tagged mycentos:1.0
[root@VM-0-6-centos ceshi]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 201f0cb357f9 3 minutes ago 295MB
- 测试运行
[root@VM-0-6-centos ceshi]# docker run -it mycentos:1.0
[root@a2a3e933ff8e local]# pwd // 与Dockerfile文件中 WORKDIR 设置的 MYPATH 一致
/usr/local
[root@a2a3e933ff8e local]# vim // vim 指令可以使用
[root@a2a3e933ff8e local]# ifconfig // ifconfig 指令可以使用
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 14 bytes 1205 (1.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 查看镜像构建历史步骤
docker history mycentos:1.0
[root@VM-0-6-centos ceshi]# docker history mycentos:1.0
IMAGE CREATED CREATED BY SIZE COMMENT
201f0cb357f9 11 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
c47254ec9a24 11 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
197b57ff7221 11 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
c0ec0ff691f8 11 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
2b19515fe29c 11 minutes ago /bin/sh -c yum -y install net-tools 24.9MB
e770a5ebe23e 11 minutes ago /bin/sh -c yum -y install vim 60.7MB
1180ba69b198 11 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
c08d48a4db30 11 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
60feb235dd11 11 minutes ago /bin/sh -c #(nop) MAINTAINER yj<yj@qq.com> 0B
300e315adb2f 6 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 6 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 6 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
我们平时拿到一个镜像,可以用 docker history 镜像id 研究一下是怎么构建的
测试CMD:
- 新建一个dockerfile文件
[root@VM-0-6-centos ceshi]# vim dockerfile-test-cmd
FROM centos
CMD [“ls”,”-a”] # 启动后执行 ls -a 命令
- 构建镜像
docker build -f dockerfile-test-cmd -t cmd-test:0.1 . - 运行镜像
[root@VM-0-6-centos ceshi]# docker run cmd-test:0.1 # 由结果可得,运行后就执行了 ls -a 命令
.
..
.dockerenv
bin
dev
etc
home
- 追加一个命令
-l成为ls -al:展示列表详细数据
[root@VM-0-6-centos ceshi]# docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused “exec: \”-l\”:
executable file not found in $PATH”: unknown.
ERRO[0000] error waiting for container: context canceled
cmd的情况下-l替换了CMD[“ls”,”-l”]而-l不是命令所以报错
测试ENTRYPOINT:
- 编写dockerfile文件
[root@VM-0-6-centos ceshi]# vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT [“ls”,”-a”]
- 构建镜像
docker build -f dockerfile-test-entrypoint -t cmd-test:0.1 . - 运行镜像
[root@VM-0-6-centos ceshi]# docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found …
-
-l命令,是直接拼接在ENTRYPOINT命令后面
[root@VM-0-6-centos ceshi]# docker run entrypoint-test:0.1 -l #注意输出结果
total 56
drwxr-xr-x 1 root root 4096 May 16 06:32 .
drwxr-xr-x 1 root root 4096 May 16 06:32 ..
-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 May 16 06:32 dev
drwxr-xr-x 1 root root 4096 May 16 06:32 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ….

