之前简略学过 Docker,过后是为了疾速部署一个我的项目,过的很快,对于 Dockerfile 文件的编写,有些显的生疏。
所以就写了这篇文章。心愿可能帮忙到大家哦!!!
一、Dockerfile 是什么?
概念:
Dockerfile 是用来构建 Docker 镜像的构建文件,由一系列命令和参数形成的脚本
构建三步骤:
- 编写 Dockerfile 文件
- docker build
- docker run
Centos 案例:
centos 案例:
FROM scratch #真正的根底镜像,ADD centos-7-x86_64-docker.tar.xz /
# label 阐明的意思
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
CMD ["/bin/bash"] #最初一行执行的命令
在哪找到的勒,在 hub.docker.com 上找到滴:centos。
咱们不会,然而能够先去看看人家怎么写的,抄作业这事,我想大家都相熟吧。俗称 CV 大法😂。
二、Dockerfile 构建过程剖析
入门常识:
-
每条保留字指令(明天的重点)都必须为
大写字母
并且前面要追随至多一个参数
。如:
FROM scratch #真正的根底镜像,ADD centos-7-x86_64-docker.tar.xz /
- 指令依照从上到下,程序执行
-
#
示意正文。# 这就是正文
-
每条指令都会创立一个新的镜像层,并对镜像进行提交。
就如上面这样,能够套娃一样。
Dockerfile 执行流程剖析:
docker
从根底镜像运行一个容器- 执行一条指令并对容器作出批改
- 执行相似
docker commit
的操作提交一个新的镜像层。 docker
再基于刚提交的镜像运行一个新容器- 执行
dockerfile
中的下一条指令直到所有指令都执行实现
后文有案例,联合案例回过来看更容易了解。
小小番外:
在现阶段,咱们将 Dockerfile
、Docker
镜像和 Docker
容器对待为软件的三个不同阶段。
Dockerfile
面向开发 —>Docker 镜像成为交付规范 —>Docker 容器则波及部署与运维
- 在
Dockerfile
中定义了过程所须要的所有货色,以前须要依赖的环境变量、依赖包、运行时环境等都被写入到Dockerfile
文件中啦。比起之前你在 Liunx 服务器中,下载那么那么多软件,配置那么那么多,真的是简略蛮多,起码对于我这个菜鸡来说用 Docker 部署真的简略了蛮多的。 Docker
镜像是在用Dockerfile
定义了一个文件后,docker build 时产生的一个 Docker 镜像,当运行时Docker
镜像时,才会真正开始提供服务。- Docker 容器就是运行起来即可提供服务的。
三、Dockerfile 保留字指令
Dockerfiel 保留字指令大抵有以下:
- FROM
- MAINTANINER
- RUN
- EXPOSE
- WORKDIR
- ENV
- ADD
- COPY
- VOLUME
- CMD
- ENTRYPOINT
- ONBUILD
3.1、FROM
根底镜像,即以后新镜像是基于哪个镜像创立的。
# 基于 openjdk:8 创立镜像
FROM openjdk:8
3.2、MAINTAINER
镜像维护者的姓名和邮箱地址
MAINTAINER 宁在春 <crush@163.com>
3.3、RUN
容器构建时须要运行的指令
RUN mkdir -p /conf/my.cn
3.4、EXPOSE
以后容器对外裸露的端口
# 暴露出 MyCat 的所需端口
EXPOSE 8066 9066
3.5、WORKDIR
指定在创立容器后,终端默认登录的进来工作目录
# 容器数据卷,用于数据保留和长久化工作
WORKDIR /usr/local/mycat
3.6、ENV
用来在构建镜像过程中设置环境变量
# 用来在构建镜像过程中设置环境变量 ENV MYCAT_HOME=/usr/local/mycat
这个环境变量能够在后续的任何 RUN 指令中应用,这就如同在命令后面指定了环境变量前缀一样; 也能够在其它指令中间接应用这些环境变量。
如:
RUN $MYCAT_HOME/mycat
3.7、ADD 和 COPY
ADD:
将宿主机目录下的文件拷贝进镜像,并且 ADD 命令会主动解决 URL 和解压 tar 压缩包
ADD centos-6-docker.tar.xz /
COPY:
相似 ADD, 拷贝文件和目录到镜像中。
将从构建上下文目录中 < 源门路 > 的文件 / 目录复制到新的一层的镜像内的 < 指标门路 > 地位
COPY src destCOPY ["src" "dest"]
3.8、VOLUME
容器数据卷,用于数据长久化和数据保留。
# 将 mycat 的配置文件的地址暴露出映射地址, 启动时间接映射宿主机的文件夹 VOLUME /usr/local/mycat
3.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
命令后追加一些命令.
3.10、ONBUILD
当构建一个被继承的 Dockerfile
时运行命令,父镜像在被子继承后,父镜像的 onbuild
被触发。
四、实战案例
4.1、制作一个本人的 Centos 镜像
4.1.1、引入:
咱们先从阿里云上拉取一个 centos 看看,看看有哪些问题,而后咱们再进行自定义。
docker pull centos # 拉取镜像 docker run -it centos #运行镜像# ===== 测试 ====vim ceshi.txtifconfig pwd
为什么会这样? 因为 docker 仓库中的 Centos 是精简版,其只有内核,没有其它的货色。
要求自定义的 Centos 可能解决上述问题。
4.1.2、编写 Dockerfile 文件
为咱们自定义的 Centos 编写 Dockerfile 文件
FROM centosMAINTAINER 宁在春 <crush@163.com>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80 CMD echo $MYPATHCMD echo "success"CMD /bin/bash #只会运行最初一个
而后把这个复制进去即可。
mkdir -p /usr/local/docker/mycentos # 本人创立寄存的地位 vim Dockerfile
4.1.3、构建 centos 镜像
docker build -f /usr/local/docker/mycentos/Dockerfile -t mycentos:1.1 .
解释:
- -f:前面追随的是 Dockerfile 文件
- -t:前面追随的镜像名和版本号。
- 最初的小数点:就表明是当前目录。
-
docker build -f Dockerfile 文件 -t 镜像名:tag .
- 当 dockerfile 文件命名为 dockerfile 时并且在当前目录下时可简写为:
-
docker build -t 镜像名:tag .docker build -t mycentos:1.1 .
执行:
看到最初的这个就是代表胜利了。
docker images
查看全副镜像:
4.1.4、运行 Centos 镜像
docker run -it mycentos:1.3pwdifconfig
之所以咱们进去容器的目录会从 /
切换到 /usr/local
是因为在 dockerfile 文件中曾经写明。
ENV MYPATH /usr/localWORKDIR $MYPATH
4.1.5、查看镜像的变更历史
docker history mycentos:1.1
在这里也能够看进去,镜像它是由 Dockerfile 文件中的指令,一层一层构建进去的。
4.2、ONBUILD 示例
率先构建一个夫镜像
编写 dockerfile
文件,命名为dockerfile2
FROM centosRUN yum -y install curlONBUILD RUN echo "我被子镜像继承了,输入此条语句"CMD ["crul", "-s","http://ip.cn"]
docker build -f /usr/local/docker/mycentos/Dockerfile2 -t my_father_centos .
构建一个镜像继承夫镜像
编写 dockerfile
文件,命名为 dockerfile3
哈
FROM my_father_centosRUN yum -y install curlCMD ["crul", "-s","http://ip.cn"]
docker build -f /usr/local/docker/mycentos/Dockerfile3 -t my_son_centos .
能够看到父镜像中的语句被输入了。
五、喃喃自语
纸上得来终觉浅,绝知此事要躬行。
大家好,我是博主
宁在春
:主页一名喜爱文艺却踏上编程这条路线的小青年。
心愿:
咱们,待别日相见时,都已有所成
。
换个小猫表情,咱们一起击个掌吧。