Docker入门:Dockerfile构建过程解析及案例演示

一、Dockerfile简介

Dockerfile是用来构建Docker镜像的文本文件,它是由一条一条构建镜像所需的指令和参数构成的脚本。

在这里插入图片描述
如上图所示,Dockerfile是独立于本地docker实例的一个文本文件,用于自动化地构建具有特定功能的docker镜像。

Dockerfile镜像构建三部曲:
(1)构建Dockerfile文件;
(2)采用docker build命令构建镜像;
(3)采用docker run命令依据镜像运行容器实例。

二、Dockerfile构建过程

2.1 Dockerfile内容基础知识

  • 1、每条保留字指令都必须为大写字母且后面至少跟随一个参数;
  • 2、指令按照自上而下顺序执行,其中#表示注释代码;
  • 3、每条指令都会创建一个新的镜像层并对镜像进行提交。

2.2 Docker执行Dockerfile的大致流程

  • 1、Docker从基础镜像运行一个容器;
  • 2、执行一条指令并对容器作出修改;
  • 3、执行类似docker commit的操作提交一个新的镜像层;
  • 4、Docker再基于刚提交的镜像运行一个新容器;
  • 5、执行dockerfile中的下一条指令直至所有指令执行完。

Dockerfile就是把单独的docker操作命令融入到一个Dockerfile脚本文件中,自动化的实现复杂的容器创建、操作与运行的过程。

2.3 Dockerfile、Docker镜像和Docker容器的关系

从应用软件开发角度来看,它们分别表示软件开发的三个阶段:

  • (1)Dockerfile是软件开发的原材料;
  • (2)Docker镜像是软件的交付品;
  • (3)Docker容器是Docker交付镜像的实例化,代表软件的实际运行过程。

在这里插入图片描述

总结:Dockerfile面向开发,Docker镜像为交付标准,Docker容器与部署、运维相关,三则相辅相成缺一不可,他们是Docker的三大基石。Docker在实际运行中,Dockerfile、Docker镜像、Docker容器三者的运作内容如下所示:

  • 1、Dockerfile定义了进程需要的一切内容,包括:代码执行、文件/环境变量、依赖包、运行环境、操作系统发行版本、服务进程、内核进程等等,很多与操作系统底层相关的内容。
  • 2、通过docker build指令会生成一个Docker镜像,它是为用户提供各种服务的基础;
  • 3、Docker容器则是一个实例化的服务进程。

三、Dockerfile保留字简介

Dockerfile文件是由一条条保留字组成的配置信息组成,常用的Dockerfile保留字如下所示:

1、FROM
基本上都会出现在Dockerfile的第一行,用于表示新建的镜像来自于哪里,即它的父类是谁,用于根据已经存在的镜像作为模板。

2、MAINTAINER
镜像维护者的姓名及邮箱地址。

3、RUN
(1)容器构建时候需要运行的命令;

(2)包括两种格式:shell格式和exec格式

(3)RUN是在docker build时运行。

4、EXPOSE
当前容器对外暴露的端口。

5、WORKDIR
指定在创建容器后,终端默认登陆的近来工作目录,一个落脚点。

6、USER
指定该镜像以什么样的用户去执行,如果不指定,默认是root

7、ENV
用来在构建镜像过程中配置环境变量。这个环境变量可以在后缀的任何RUN指令中使用,这就好比在命令前面指定了环境变量一样。比如下面指令:

ENV MY_PATHY /usr/mytest
WORKDIR $MY_PATH

上面的环境变量MY_PATH指定为/usr/mytest,后续可以直接使用MY_PATH代替/usr/mytest。比如,我们使用WORKDIR $MY_PATH表示创建容器后,终端登陆的工作目录为/usr/mytest

8、ADD
将宿主机目录下的文件拷贝到镜像内部,并且会自动处理URL和解压tar压缩包。

9、COPY
ADD相似,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件或目录复制到新的一层镜像内的<目标路径>中。其指令格式如下所示:

COPY src dest

或者

COPY ["src", "dest"]

(1)src:源文件或者源目录
(2)dest:容器内的指定路径,这个路径不用事先构建好,执行指令的时候会自动创建。

10、VOLUME
指定由红与数据保存、备份和持久化工作的容器卷。

11、CMD
1、CMD的作用与指令格式
指定容器启动后要干的事情。CMD指令格式与RUN相似,也包含两种格式:

  • (1)shell格式:CMD <命令>
  • (2)exec格式:CMD ["可执行文件", "参数1", "参数2" ...]
  • (3)参数列表格式:CMD ["参数1", "参数2" ...]。在指定了ENTRYPOINT指令后,用CMD指定具体的参数。也就是当具有了ENTRYPOINT后,CMD就变成了传递参数的工具了。

注意:Dockerfile中可以由多个CMD指令,但是只有最后一个生效,并且CMD会被docker run之后的参数替换。

2、CMDRUN命令的区别
(1)CMDdocker run时运行;
(2)RUNdocker build时运行。

12、ENTRYPOINT
1、ENTRYPOINT的作用与指令格式
指定容器启动时候要运行的命令,类似于CMD指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数传送给ENTRYPOINT指令指定的程序。ENTRYPOINT的指令格式如下所示:

ENTRYPOINT ["<executeable>", "<param1>", "<param2>", ...]
  • ENTRYPOINT可以和CMD一起用,通常情况下变参才会使用CMD,这里的CMD相当于给ENTRYPOINT传参。

2、ENTRYPOINT应用案例——通过Dockerfile构建nginx:test镜像

FROM nginx

ENTRYPOINT ["nginx", "-c"]		#定参
CMD ["/etc/nginx/nginx.conf"]	#变参
是否传参按照dockerfile编写执行传参运行
Docerk命令docker run nginx:testdocker run nginx:test-c /etc/nginx/new.conf
衍生出的实际命令nginx -c /etc/nginx/nginx.confnginx -c /etc/nginx/new.conf

四、Dockerfile应用实例——以Centos为例

这里采用Dockerfile创建一个基于Centos的自定义镜像My_Centos_java8,构建步骤如下所示:

1、制作Centos镜像需求说明

由于下载的镜像只是Centos的最小系统,甚至连最基本的vimifconfig都没有,更不用说java了。所以这里使用dockerfile文件的构建一个具备vim+ifconfig+jdk8的Centos7镜像。

JDK的下载镜像地址为:https://mirrors.yangxingzhen.com/jdk/,用于后面配置Centos系统的java开发环境。随便找个版本下载下来(我这里选择的是最新版本),放到本地的/liang/My_Centos_java8文件夹中。

2、编写Dockerfile文件

在上图的/liang/My_Centos_java14中创建Dockerfile_Centos文件,在文件中输入如下的Dockerfile代码:

FROM centos

ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#使用ADD命令将本地文件夹下的dk-8u171-linux-x64.tar.gz添加到容器中。Docker_Centos必须与安装包处于>同一个文件夹内
ADD jdk-14_linux-x64_bin.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

CMD echo $MYPATH
CMD echo "success-----------------------OK"
CMD /bin/bash

3、根据Dockerfile构建自定义的镜像

注意:执行下面指令的时候必须与上面的Dockerfile_Centos文件在同一个目录中!

指令格式为:

docker build -t 新镜像名字:TAG .

注意TAG后面有个空格和一个.

具体到这里的命令为:

docker build -t centosjava8:v1 .
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Dockerfile是用于构建Docker镜像的文本文件,其中包含了一系列指令和参数,用于指定镜像的构建过程Dockerfile可以通过编写文本文件来定义镜像的构建过程,然后通过docker build命令来构建镜像。Dockerfile中的指令包括FROM、RUN、COPY、ADD、CMD、ENTRYPOINT等,这些指令可以用于定义镜像的基础环境、安装软件、复制文件等操作。通过Dockerfile可以实现镜像的自动化构建,提高了镜像构建的效率和可重复性。 ### 回答2: Dockerfile是定义Docker镜像的文本文件,使用Dockerfile可以方便地自定义应用程序的镜像。Dockerfile包含了通过一系列指令构建Docker镜像所需要的步骤和指令。每个指令代表了构建过程中的一个操作步骤。 常用的指令包括FROM、RUN、CMD、EXPOSE、ENTRYPOINT等,这些指令可以让我们在构建镜像的过程中完成各种常见的操作,如安装软件包、配置环境变量、拷贝文件等,而不需要手工进行。 使用Dockerfile构建镜像的步骤如下: 1. 定义基础镜像。使用FROM指令来指定Docker官方的基础镜像,如Ubuntu、CentOS等。 2. 安装应用程序。使用RUN指令来运行必要的命令,如安装软件包、配置环境变量等。 3. 复制文件。使用COPY和ADD指令来将文件和目录复制到镜像中。 4. 暴露端口。使用EXPOSE指令来指定容器可以使用的端口。 5. 定义启动命令。使用ENTRYPOINT和CMD指令来定义容器启动时要执行的命令。 以上步骤可以组合使用,以构建满足我们应用程序需求的镜像。 使用Dockerfile构建镜像的好处是,可以轻松地对不同环境的应用程序进行打包和部署。同时,也可以简化应用程序部署的过程,加快应用程序的开发和交付速度,提高系统稳定性和版本管理的可控性。 总之,DockerfileDocker极为重要的一个组成部分。通过Dockerfile构建,我们可以更好地管理和部署应用程序,让开发者和管理员更便利地管理和维护整个应用生态。 ### 回答3: DockerfileDocker用来构建镜像的脚本文件,其中包含构建镜像的指令和参数,以及镜像生成的源文件等信息。使用Dockerfile可以让我们自动化构建镜像,快速生成想要的环境和配置,并且可复用性和可维护性较高。 Dockerfile的基本语法: FROM:指定镜像的基础镜像。 MAINTAINER:设置镜像作者和作者的联系方式。 RUN:在镜像中执行命令,用来安装软件或调整环境。 ADD:将文件或目录添加到镜像中。 COPY:将文件或目录复制到镜像中。 WORKDIR:设置容器中工作目录。 ENV:设置环境变量。 EXPOSE:声明容器中的服务端口。 CMD:定义容器中默认执行的命令和参数。 在Dockerfile中,每一条指令都会生成一个新的镜像层,当我们想更改其中某一层时,只需更改该层指令及其以下的指令即可,不需要重新构建整个镜像。 使用Dockerfile可以自动化构建镜像,但是需要注意一些细节: 1. 使用Dockerfile时,标准化设置镜像环境和配置文件,以便于后续的调试和部署。 2. 防止指令顺序变化,可以使用其他的构建工具或者版本管理工具来管理镜像构建过程。 3. 构建时可以使用缓存,避免重复安装某个软件包,但是需要注意更新和清理缓存。 总之,DockerfileDocker构建镜像的重要方式之一,灵活使用Dockerfile可以让我们更高效地构建和管理Docker镜像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值