之前简略学过Docker,过后是为了疾速部署一个我的项目,过的很快,对于Dockerfile文件的编写,有些显的生疏。

所以就写了这篇文章。心愿可能帮忙到大家哦!!!

一、Dockerfile是什么?

概念:

Dockerfile是用来构建Docker镜像的构建文件,由一系列命令和参数形成的脚本

构建三步骤:

  1. 编写Dockerfile文件
  2. docker build
  3. 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构建过程剖析

入门常识:

  1. 每条保留字指令(明天的重点)都必须为大写字母并且前面要追随至多一个参数

    如:

    FROM scratch  #真正的根底镜像,ADD centos-7-x86_64-docker.tar.xz /
  2. 指令依照从上到下,程序执行
  3. #示意正文。

    #这就是正文
  4. 每条指令都会创立一个新的镜像层,并对镜像进行提交。

    就如上面这样,能够套娃一样。

Dockerfile执行流程剖析:

  1. docker从根底镜像运行一个容器
  2. 执行一条指令并对容器作出批改
  3. 执行相似docker commit的操作提交一个新的镜像层。
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行实现

后文有案例,联合案例回过来看更容易了解。


小小番外

在现阶段,咱们将DockerfileDocker镜像和Docker容器对待为软件的三个不同阶段。

Dockerfile面向开发--->Docker镜像成为交付规范--->Docker容器则波及部署与运维

  • Dockerfile中定义了过程所须要的所有货色,以前须要依赖的环境变量、依赖包、运行时环境等都被写入到Dockerfile文件中啦。比起之前你在Liunx服务器中,下载那么那么多软件,配置那么那么多,真的是简略蛮多,起码对于我这个菜鸡来说用Docker部署真的简略了蛮多的。
  • Docker镜像是在用Dockerfile定义了一个文件后,docker build 时产生的一个Docker镜像,当运行时Docker镜像时,才会真正开始提供服务。
  • Docker容器就是运行起来即可提供服务的。

三、Dockerfile保留字指令

Dockerfiel保留字指令大抵有以下:

  1. FROM
  2. MAINTANINER
  3. RUN
  4. EXPOSE
  5. WORKDIR
  6. ENV
  7. ADD
  8. COPY
  9. VOLUME
  10. CMD
  11. ENTRYPOINT
  12. 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 .

能够看到父镜像中的语句被输入了。

五、喃喃自语

纸上得来终觉浅,绝知此事要躬行。

大家好,我是博主宁在春:主页

一名喜爱文艺却踏上编程这条路线的小青年。

心愿:咱们,待别日相见时,都已有所成

换个小猫表情,咱们一起击个掌吧。