前言
前面章节已经详细介绍介绍了 Docker 三大核心,包含镜像、容器和仓库。我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dockerfile 是镜像和容器的关键。如果你要构建自定义镜像,Dockerfile 是你必须学会的技能之一。本文详细介绍dockerfile一些知识点和如何使用 Dockerfile 的方式构建镜像。
知识点
Dockerfile 概念
dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。详细理解Dockerfile 就是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
Dockerfile好处
(1)易于版本化管理,Dockerfile 本身就是一个文本文件,方便存放在代码仓库中进行版本管理,也方便查找各个版本之间的变更历史。
(2)无需考虑环境便于构建,使用Dockerfile构建镜像不需要考虑构建环境,基于同一个Dockerfile,无论在哪里运行,构建结果都是一致的。
(3)过程可以追溯,Dockerfile 中的每一行指令代表一个镜像层, 根据Dockerfile的内容,可以清晰的查看到镜像的完整构建过程。
Dockerfile 书写原则
(1)单一职责,容器的本质就是一个过程,不同功能的应用程序应该尽可能地划分到不同的容器中,每个容器只负责一个业务流程。
(2)保持容器最小化,应该避免安装无用的软件包。
(3)合理选择基础镜像,容器的核心是应用,所以只要基础镜像可以满足应用的运行环境。
(4)尽量使用构建缓存,利用缓存,可以大大缩短镜像构建时间。
(5)最小化镜像层数,在构建镜像时尽可能地减少 Dockerfile 指令行数。
小贴士:除了上面这些书写原则外,我们在书写过程中也要注意提供注释信息,正确设置时区,使用.gitignore文件忽略一些不需要做版本管理的文件,学会这些书写原则会助你编写最优Dockerfile。
操作
DockerFile****构建过程
(1)docker从基础镜像运行一个容器
(2)执行一条指令并对容器做出修改
(3)执行类似 docker commit 的操作提交一个新的镜像层
(4)Docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成!
小提示: DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。DockerFile 是软件的原材料 (代码) 、Docker 镜像则是软件的交付品 (.apk)、Docker 容器则是软件的运行状态 (客户下载安装执行) 。
DockerFile****指令
关键字:
FROM # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER # 镜像维护者的姓名混合邮箱地址
RUN # 容器构建时需要运行的命令
ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY # 类似ADD,拷贝文件和目录到镜像中!
VOLUME # 容器数据卷,用于数据保存和持久化工作
CMD # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最
后一个生效!
EXPOSE # 当前容器对外保留出的端口
WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV # 用来在构建镜像过程中设置环境变量
ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的 ONBUILD被触发
DockerFile实战
查看下官方默认的CentOS的情况:
目的:使我们自己的镜像具备如下:登陆后的默认路径、支持vim编辑器、ifconfig命令
(1)新建一个 docker-test-volume文件夹
mkdir docker-test-volume
(2)编写DockerFile文件
[root@daxiong home]# cd docker-test-volume/
[root@daxiong docker-test-volume]# vim dockerfile-centosFROM centos
MAINTAINER daxiong<123456:@qq.com>
ENV MYPATH /usr/local # 初始位置
WORKDIR MYPATH\ RUN yum -y install vim # 安装vim\ RUN yum -y install net-tools # 安装net-tools\ EXPOSE 80\ CMD echo MYPATH
CMD echo "----------end--------"
CMD /bin/bash
(3)build后生成镜像,获得一个新镜像,命令如下:
docker build -f dockerfile地址 -t 新镜像名字:TAG .
docker build -f dockerfile-centos -t mycentos:test .
小提示:一定要注意后面有个 .
点,执行命令后,就会把docker文件配置的安装包,都安装上
(4)启动容器
docker run -it 新镜像名字:TAG
docker run -it mycentos:test
可以看到默认路径更改,vim/ifconfig命令都可以使用了。
小贴士:我们也可以通过docker history 镜像名 该命令,看到对应历史步骤。
Dockerfile 指令书写建议
(1)使用RUN指令时内容尽量按字母排序,如果内容比较复杂时,建议使用反斜杠(\) 结尾并且换行。
(2)CMD和ENTRYPOINT指令都是容器运行的命令入口,Dockerfifile 中可以有多个CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换!而docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合!如果你希望你的镜像足够灵活,推荐使用CMD指令。
(3)ADD和COPY指令功能类似,都是从外部往容器内添加文件。COPY指令只支持基本的文件和文件夹拷贝功能,ADD则支持更多文件来源类型。推荐你使用COPY指令,因为COPY指令更加透明,仅支持本地文件向容器拷贝。
总结
通过本篇文章,相信你已经对 Dockerfile 的书写原则、常用命令、重要指令有了较深的认识。
如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。欢迎关注,一起docker学习之旅!