6、DockerFile解析:三步走、保留字指令
1、dockerfiel是什么
1、是什么
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
2、构建三步骤
编写Dockerfile文件
docker build
docker run
3、文件什么样???
centos 199MB
它的dockerfile如何描写的
以我们熟悉的CentOS为例
https://hub.docker.com/_/centos/
# scratch 基础镜像类 # maintainer 作者+邮箱 # ADD 添加并解压,压缩包 # label 说明 # 默认cmd shell: bin/bash docker run -it centos docker run -it centos /bin/bashc
警醒:
90后拼的是执行力与自我驱动力
不会怎么办,立刻现在马上去学
不懂怎么办,立刻现在马上去做
做着做着感觉就来了
2、DockerFile构建过程解析
类的加载顺序
1、Dockerfile内容基础知识
1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层,并对镜像进行提交
字指令 FROM等
2、Docker执行Dockerfile的大致流程
(1)docker从基础镜像运行一个容器
(2)执行一条指令并对容器作出修改
(3)执行类似docker commit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成
FROM scratch MAINTAINER The CentOS Project <cloud-ops@centos.org> ADD c68-docker.tar.xz / LABEL name="CentOS Base Image" \ vendor="CentOS" \ license="GPLv2" \ build-date="2016-06-02" # Default command CMD ["/bin/bash"]
3、小总结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
* Dockerfile是软件的原材料
* Docker镜像是软件的交付品
* Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
(1) Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。
Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
(2)Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
(3)Docker容器,容器是直接提供服务的。
3、DockerFile体系结构(保留字指令)
1、保留字指令
RUN 容器构建时需要运行的命令 ENV 用来在构建镜像过程中设置环境变量 WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点 MAINTAINER 镜像维护者的姓名和邮箱地址 FROM 基础镜像,当前新镜像是基于哪个镜像的 EXPOSE 当前容器对外暴露出的端口
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 RUN 容器构建时需要运行的命令 ENTRYPOINT 指定一个容器启动时要运行的命令 ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
VOLUME 容器数据卷,用于数据保存和持久化工作 COPY 类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置 COPY src dest COPY ["src", "dest"] ENV 用来在构建镜像过程中设置环境变量 WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点 MAINTAINER 镜像维护者的姓名和邮箱地址 ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发 FROM 基础镜像,当前新镜像是基于哪个镜像的
CMD 指定一个容器启动时要运行的命令 Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换 ENTRYPOINT 指定一个容器启动时要运行的命令 ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
2、解析
RUN
执行的linux的命令
echo ‘success............’
EXPOSE
WORKDIR
没有指定,默认为 /
ENV
ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;
也可以在其它指令中直接使用这些环境变量,
比如:WORKDIR $MY_PATH
VOLUME
CMD
ONBUILD
子镜像运行中,如果父镜像想干点收尾的工作,可以填写这个
4、ADD和COPY
ADD比copy强大,add是复制并解压,压缩包
5、CMD和ENTRYPOINT
CMD只有最后一个生效,相当于 替换 echo 1 > test.txt
自己定义的dockerFile会把docker内部的dockerfile中的cmd命令替换
CMD 会被 docker run 之后的参数替换???等会讲
ENTRYPOINT 相当于追加命令,都要执行 echo 2 >> test.txt
6、小总结
上面的理论知识。官网都有,官方文档翻译过来的
学了,你来给我写个,有屁用,怎么用
看看官网就会,翻翻源码
尚硅谷,案例来介绍,这些所有的字指令
重点是:
现在谁没有学习能力
重要的是怎么练,运用知识的能力
不要浮躁,认认真真