docker目录
- [1 Dockerfile是什么](#1 Dockerfile是什么)
- [2 Dockerfile能干嘛](#2 Dockerfile能干嘛)
- [3 如何书写Dockerfile](#3 如何书写Dockerfile)
-
- [3.1 Dockerfile构建过程解析](#3.1 Dockerfile构建过程解析)
- [3.2 小总结](#3.2 小总结)
- [3.3 Dockerfile的基本知识](#3.3 Dockerfile的基本知识)
- [3.5 保留字](#3.5 保留字)
-
- FROM
- MAINTAINER
- [RUN 有两种方式](#RUN 有两种方式)
- EXPOSE
- WORKDIR
- ENV
- USER
- VOLUME
- ADD
- CMD
- ENTRYPOINT
- [4 后记](#4 后记)
1 Dockerfile是什么
Dockerfile顾名思义就是跟docker有关的文件,官方一点就是用于构建docker镜像的文本文件,是由指令和参数组成的脚本。
tips:Dockerfile的第一个字母要大写,不要问我为什么?比如张三就是叫张三。
Dockerfile官网链接给到大家啦,自行按需查看捏~
https://docs.docker.com/reference/dockerfile/
2 Dockerfile能干嘛
我们之前了解过,相对于传统的虚拟机来说,docker的速度能够达到秒级,是因为docker的镜像都是十分基础的,里面的内核都是必须的 ,不必要的东西都需要后天的去增加功能。比如基础的ubuntu是没有vim、ifconfig的,这就需要我们手动操作,那不难理解,随着我们需求的增加,可能不断需要新的增加内容,因为我们需求的不断变化,使得我们重复安装内容的操作逐渐麻烦,所以Dockerfile应运而生。
我的理解是Dockerfile能够批量进行操作,运行命令和参数,便于我们创建所需的镜像。
3 如何书写Dockerfile
构建三部曲:编写Dockerfile------> docker build构建镜像--------> docker run
3.1 Dockerfile构建过程解析
Docker执行Dockerfile的大致流程
1 docker从基础镜像运行一个容器
2 执行一条指令并对容器作出修改
3 执行类似docker commit的操作提交一个新的镜像层
4 docker再基于刚提交的镜像运行一个新容器
5 执行Dockerfile中的下一条指令直到所有指令都执行完成
3.2 小总结
从应用软件 的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,Dockerfile是软件的原材料,Docker镜像是软件的交付产品,Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例。
3.3 Dockerfile的基本知识
1 每条保留字指令都必须为大写字母,且后面要跟随至少一个参数;
2 指令按照从上到下,顺序执行;
3 #表示注释;
4 每条指令都会创建一个新的镜像层并对镜像进行提交。
是不是看到这里就想,啥是保留字啊,我刚学的时候也一头雾水了。
3.5 保留字
注意,上文提到过,保留字都是大写字母且至少跟随一个参数
FROM
基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM,类似与基类或者说父类
MAINTAINER
镜像维护者的姓名和邮箱地址
RUN 有两种方式
RUN yum -y install vim --------相当于shell命令
RUN ["可执行文件", "参数1", ...] -------------exec格式
我们用shell命令多一点,可以发现它就是RUN
加上我们的Linux命令,更加适合中国宝宝的学习方式,更好地迁移学习。
RUN
是在 docker build
时运行的
EXPOSE
当前容器对外暴露出的端口
bash
#暴露80端口
EXPOSE 80
WORKDIR
指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV
用来在构建镜像过程中设置环境变量
USER
指定该镜像以什么样的用户去执行,如果都不指定,默认是root
VOLUME
容器数据卷,用于数据保存和持久化工作
ADD
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
CMD
指定容器启动后要干的事情
CMD指令的格式和 RUN 类似,也是两种格式:
1 shell 格式: CMD <命令>
2 exec格式: CMD["可执行文件","参数1","参数2"...]
3 参数列表格式:CMD["参数1","参数2"...],在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数
注意:
1 Dockerfile中可以有多个
CMD
指令,但只有最后一个生效,CMD
会被docker run
之后的参数替换2
CMD
和RUN
的区别:CMD
是在docker run
时运行;RUN
是在docker build
时运行
ENTRYPOINT
类似于CMD
,用来指定一个容器启动时要运行的命令,但不会被docker run
后面的命令覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT
指令指定的程序。
ENTRYPOINT
可以和CMD
一起使用,一般是变参才会使用CMD
,这里的CMD
等于是在给ENTRYPOINT
传参。
就是说,当指定了ENTRYPOINT
后,CMD
的含义就发生了变化,不再是直接运行其命令,而是将CMD
的内容作为参数传递给ENTRYPOINT
指令,他们的组合会变成<ENTRYPOINT> "<CMD>"
优点:在执行
docker run
的时候可以指定ENTRYPOINT
运行所需的参数。
注意:如果Dockerfile中存在多个
ENTRYPOINT
指令,仅最后一个生效
4 后记
下一篇讲一下Dockerfile的案例,记得来看啊~
BB啊 ,如果本文档对您有一点点用的话,记得给美丽好学的我点个大大的赞,谢谢BB~
今天带了大圈的耳环尊嘟很好看,很开心,素颜也好看,嘻嘻!愿我们都有一个好心情!