一、Dockerfile简介
随着容器技术的普及,编写正确的dockerfile文件成为了一项基本技能,今天简要说一下dockerfile中的一些学习笔记
在现阶段,我们将Dockerfile
、Docker
镜像和Docker
容器看待为软件的三个不同阶段。
Dockerfile
面向开发--->Docker镜像成为交付标准--->Docker容器则涉及部署与运维
-
在
Dockerfile
中定义了进程所需要的一切东西,以前需要依赖的环境变量、依赖包、运行时环境等都被写入到Dockerfile
文件中啦。比起之前你在Liunx服务器中,下载那么那么多软件,配置那么那么多,真的是简单蛮多,起码对于我这个菜鸡来说用Docker部署真的简单了蛮多的。 -
Docker
镜像是在用Dockerfile
定义了一个文件后,docker build 时产生的一个Docker镜像,当运行时Docker
镜像时,才会真正开始提供服务。 -
Docker容器就是运行起来即可提供服务的。
二、Dockerfile保留字指令
1、FROM
基础镜像,即当前新镜像是基于哪个镜像创建的。
#基于openjdk:8 创建镜像
FROM openjdk:8
2、MAINTAINER
镜像维护者的姓名和邮箱地址
MAINTAINER 宁在春<crush@163.com>
3、RUN
容器构建时需要运行的指令
RUN mkdir -p /conf/my.cn
4、EXPOSE
当前容器对外暴露的端口
#暴露出MyCat的所需端口
EXPOSE 8066 9066
5、WORKDIR
指定在创建容器后,终端默认登录的进来工作目录
#容器数据卷,用于数据保存和持久化工作
WORKDIR /usr/local/mycat
6、ENV
用来在构建镜像过程中设置环境变量
#用来在构建镜像过程中设置环境变量ENV MYCAT_HOME=/usr/local/mycat
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量。
如:
RUN $MYCAT_HOME/mycat
7、ADD 和 COPY
ADD:
将宿主机目录下的文件拷贝进镜像,并且ADD命令会自动处理URL和解压tar压缩包
ADD centos-6-docker.tar.xz /
COPY:
类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
COPY src destCOPY ["src" "dest"]
8、VOLUME
容器数据卷,用于数据持久化和数据保存。
#将mycat的配置文件的地址暴露出映射地址,启动时直接映射宿主机的文件夹VOLUME /usr/local/mycat
9、CMD 和 ENTRYPOINT
CMD
CMD的指令和RUN相似,也是两种格式:
-
shell
格式:CMD<命令> -
exec
格式:CMD ["可执行文件“,”参数1“,”参数2“.....]
Dockerfile
中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run
之后的参数替换。
ENTRYPOINT
指定一个容器启动时要运行的命令。
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。
区别:
在这里先简单说明一下区别,你可以将CMD理解为覆盖
CMD cat /conf/my.cnfCMD /bin/bash
这两条指令都写在Dockerfile
文件中,只会执行CMD /bin/bash ,而不会执行CMD cat /conf/my.cnf
,因为CMD /bin/bash
把上一条直接覆盖掉了。
而ENTRYPOINT
则不同,你可以将ENTRYPOINT
简单理解为追加。
主要体现在docker run
上,如果使用dockerfile
文件中最后是CMD
结尾,则在运行时不能够额外追加命令,否则会覆盖掉Dockerfile
中的CMD
命令。
而Dockerfile
文件中最后一行为ENTRYPOINT
结尾时,你可以在docker run
命令后追加一些命令.
10、ONBUILD
当构建一个被继承的Dockerfile
时运行命令,父镜像在被子继承后,父镜像的onbuild
被触发。
三、Dockerfile执行流程分析:
-
docker
从基础镜像运行一个容器 - 执行一条指令并对容器作出修改
- 执行类似
docker commit
的操作提交一个新的镜像层。 -
docker
再基于刚提交的镜像运行一个新容器 - 执行
dockerfile
中的下一条指令直到所有指令都执行完成