什么是Dockerfile呢?如何编写最优Dockerfile

1,322 阅读3分钟

前言

前面章节已经详细介绍介绍了 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-centos

FROM 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学习之旅!