# 一、Dockerfile 是什么?
DockerFile
是用来构建Docker
镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤: 编写Dockerfile
文件——>docker build
[image]——>docker run
[container]
例如:centos
构建文件:
FROM scratch #scratch相当于java中的object对象
ADD centos-7-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="20180531"
CMD ["/bin/bash"]
2
3
4
5
6
7
8
9
10
# 二、Docker 构建过程解析
【1】Dockerfile
内容基础知识:
● 每条保留字指令都必须为大写字母且后面要跟随至少一个参数。
● 指令按照从上到下,顺序执行。
● #表示注释。
● 每条指令都会创建一个新的镜像层,并对镜像进行提交。
【2】Docker
执行Dockerfile
的大致流程:
● docker
从基础镜像运行一个容器。
● 执行一条指令并对容器做出修改。
● 执行类似docker commit
的操作提交一个新的镜像层。
● docker
再基于刚提交的镜像运行一个新容器。
● 执行dockerFile
中的下一条指令直到所有指令都执行完。
总结: 从应用软件的角度来看,Dockerfile
、Docker
镜像与Docker
容器分别代表软件的三个不同阶段。
▶ Dockerfile
是软件的原材料。
▶ Dockerfile
镜像是软件的交付品。
▶ Docker
容器则是可以是软件的运行态。
Dockerfile
面向开发,Docker
镜像成为交付标准,Docker
容器则涉及部署与运维,三者缺一不可,合力充当Docker
体系的基石。

■ Dockerfile
:需要定义一个Dockerfile
文件,Dockerfile
定义了进程需要的一切东西。Dockerfile
涉及的内容包括执行代码或者文件、环境、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核系统(当应用进程需要和系统服务和内核进程进行打交道,这时需要考虑如何设置权限控制等等)
■ Docker
镜像:在用Dockerfile
定义一个文件后,docker build
时会产生一个Docker
镜像,当运行Docker
镜像时,会真正开始提供服务。
■ Docker
容器:容器才是真正为我们提供服务的。
# 三、Docker保留字指令
【1】FORM
:基础镜像,当前新镜像时基于那个镜像的,相当于继承。
【2】MAINTAINER
:作者姓名和邮箱。
【3】RUN
:容器构建时需要运行的命令。例如:
echo "Asia/Shanghai" > /etc/timezone && rm -rf /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
【4】EXPOSE
:对外的端口号。
【5】WORKDIR
:指定在创建容器后,终端默认登录后进入的目录。例如:/work
【6】ENV
:用来构建镜像过程中设置的环境变量。例如:LANG C.UTF-8
【7】ADD
:将宿主机目录下的文件拷贝到镜像且ADD
命令会自动处理URL
和解压缩包。例如:run.sh .
【8】COPE
:类似ADD
,拷贝文件和目录到镜像,将从构建上下文目录中的文件/目录复制到新的一层的镜像内的位置。
【9】VOLUME
:容器数据卷,用于数据保存和持久化工作。
【10】CMD
:指定一个容器启动时要运行的命令。Dockerfile
中可以有多个CMD
指令,但只有最后一个生效,CMD
会被docker run
之后的参数替换。例如:["./run.sh"]
【11】ENTRYPOINT
:指定一个容器启动时要运行的命令。目的和CMD
一样,都是在指定容器启动程序及参数。不会覆盖。
【12】ONBUILD
:当构建一个被继承的Dockerfile
时运行命令,父镜像在被子继承后父镜像的onbuild
被触发。
# 四、案例
【1】Base
镜像scratch
:Docker Hub
中99%
的镜像都是通过在base
镜像中安装和配置需要的软件构建出来的。
【2】自定义镜像mycentos
:需求是登录后默认路径不为/根目录下,应为自定义的目录、支持vim
和ifconfig
等命令。
✔ 编写mycentos
如下:
FROM centos
MAINTAINER zzx<zzx@qq.com>
#把宿主机与当前文件同目录下的host.txt 复制到 容器中的loacl文件下,并改名为continal.txt
COPE host.txt /usr/local/continal.txt
#复制Tomcat 到容器的local目录并进行解压
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#定义容器默认录入
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装指定命令
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
#ENTRYPOINT 与CMD类似,只是它为连接CMD是替换
CMD bin/bash
#ONBUILD 表示别的file 继承此镜像 FROM时会触发
ONBUILD RUN echo "father"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
✔ 构建:docker build -t
新镜像名:tag .
docker build -f /mydocker/Dockerfile2.text -t mycentos:1 .

✔ 运行:docker run -it 镜像名:tag
。-it
参数告诉了Docker
项目在启动容器后,需要给我们分配一个文本输入 / 输出环境,也就是 TTY(终端设备的统称),跟容器的标准输入相关联,这样我们就可以和这个Docker
容器进行交互了。
✔ 列出镜像的变更历史:docker history 镜像ID
