浅谈Dockerfile文件

DockerFile

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

DockerFile构建过程解析

Dockerfile内容基础知识

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

Docker执行Dockerfile的大致流程

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

从应用软件的角度来看,DockerfileDocker镜像Docker容器分别代表软件的三个不同阶段。

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行态。

Dockerfile面向开发、Docker镜像成为交付标准、Docker容器则涉及部署和运维,三者缺一不可,合力充当Docker体系的基石。

Dockerfile文件Dockerfile定义了进程需要的一切东西,Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等。

Docker镜像:在用Dickerfile定义一个文件之后,通过docker build命令会产生一个Docker镜像,当运行Docker镜像时,会真正开始提供服务。

Docker容器:容器是直接提供服务的。

Dockerfile体系结构

FROM:说明当前镜像时基于哪个镜像

MAINTAINER:镜像维护者的姓名和邮箱地址

RUN:容器构建时需要运行的命令

EXPOSE:当前容器对外暴露的端口

WORKDIR:指定在创建容器后,终端默认登陆进来的工作目录

ENV:用来在构建镜像过程中设置环境变量

ADD:将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL解压tar压缩包

COPY:类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中(源路径)的目录/文件复制到新的一层的镜像内的(目标路径)位置

VOLUME:容器数据卷,用于数据保存和持久化工作

CMD:指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run命令后面的参数替换

ENTRYPOINT:指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序的参数

ONBUILD:当构建一个继承的Dockerfile时运行命令,父镜像在被子继承后,父镜像的onbuild被触发,类似构建一个触发器。

Dockerfile案例

Base镜像(scratch):Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。

自定义镜像mycentos
  1. Docker Hub默认的centos镜像
    在这里插入图片描述

  2. centos目的使我们自己的镜像具备如下:

    • 登陆后的默认路径 /usr/local

    • 具有vim编辑器

    • 能够查看网络配置ifconfig支持

编写Dockerfile文件

在这里插入图片描述

#自定义Centos
#进入容器时落脚点为/usr/local
#具有vim编辑器
#能够通过ifconfig查看ip

#指定自定义镜像的基础镜像
FROM centos

#指定落脚点
ENV path /usr/local
WORKDIR $path

#下载vim编辑器
RUN yum -y install vim
RUN yum -y install net-tools
#容器启动时要运行的命令,但是当存在多个CMD指令时候,只有最后一个会生效
CMD echo $path
CMD echo 镜像制作成功 yyds !!!
CMD /bin/bash
构建镜像
docker build -t 新镜像名称:TAG
[root@centos7 mydocker]# docker build -t mycentos:0.0.1 .
Sending build context to Docker daemon  27.65kB
Step 1/8 : FROM centos
 ---> 5d0da3dc9764
Step 2/8 : ENV path /usr/local
 ---> Running in db1f97744d8b
Removing intermediate container db1f97744d8b
 ---> 5d794b479c05
Step 3/8 : WORKDIR $path
 ---> Running in 937c50aea15d
Removing intermediate container 937c50aea15d
 ---> 9338fb574845
Step 4/8 : RUN yum -y install vim
 ---> Running in 594c6c54534b
CentOS Linux 8 - AppStream                       96 kB/s | 9.6 MB     01:42
CentOS Linux 8 - BaseOS                         537 kB/s | 8.5 MB     00:16
CentOS Linux 8 - Extras                          16 kB/s |  10 kB     00:00
Last metadata expiration check: 0:00:01 ago on Sat Nov  6 13:27:56 2021.
Dependencies resolved.
================================================================================
 Package             Arch        Version                   Repository      Size
================================================================================
Installing:
 vim-enhanced        x86_64      2:8.0.1763-15.el8         appstream      1.4 M
Installing dependencies:
 gpm-libs            x86_64      1.20.7-17.el8             appstream       39 k
 vim-common          x86_64      2:8.0.1763-15.el8         appstream      6.3 M
 vim-filesystem      noarch      2:8.0.1763-15.el8         appstream       48 k
 which               x86_64      2.21-12.el8               baseos          49 k

Transaction Summary
================================================================================
Install  5 Packages

Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm         79 kB/s |  39 kB     00:00
(2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp  55 kB/s |  48 kB     00:00
[MIRROR] which-2.21-12.el8.x86_64.rpm: Status code: 403 for http://mirrors.tuna.tsinghua.edu.cn/centos/8.4.2105/BaseOS/x86_64/os/Packages/which-2.21-12.el8.x86_64.rpm (IP: 101.6.15.130)
(3/5): which-2.21-12.el8.x86_64.rpm              47 kB/s |  49 kB     00:01
(4/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm   82 kB/s | 1.4 MB     00:16
(5/5): vim-common-8.0.1763-15.el8.x86_64.rpm    124 kB/s | 6.3 MB     00:52
--------------------------------------------------------------------------------
Total                                           146 kB/s | 7.8 MB     00:54
warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS Linux 8 - AppStream                      1.6 MB/s | 1.6 kB     00:00
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>"
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : which-2.21-12.el8.x86_64                               1/5
  Installing       : vim-filesystem-2:8.0.1763-15.el8.noarch                2/5
  Installing       : vim-common-2:8.0.1763-15.el8.x86_64                    3/5
  Installing       : gpm-libs-1.20.7-17.el8.x86_64                          4/5
  Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64                          4/5
  Installing       : vim-enhanced-2:8.0.1763-15.el8.x86_64                  5/5
  Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64                  5/5
  Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64                    5/5
  Verifying        : gpm-libs-1.20.7-17.el8.x86_64                          1/5
  Verifying        : vim-common-2:8.0.1763-15.el8.x86_64                    2/5
  Verifying        : vim-enhanced-2:8.0.1763-15.el8.x86_64                  3/5
  Verifying        : vim-filesystem-2:8.0.1763-15.el8.noarch                4/5
  Verifying        : which-2.21-12.el8.x86_64                               5/5

Installed:
  gpm-libs-1.20.7-17.el8.x86_64         vim-common-2:8.0.1763-15.el8.x86_64
  vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch
  which-2.21-12.el8.x86_64

Complete!
Removing intermediate container 594c6c54534b
 ---> cf4c0605041d
Step 5/8 : RUN yum -y install net-tools
 ---> Running in 91a6b1162d17
Last metadata expiration check: 0:01:07 ago on Sat Nov  6 13:27:56 2021.
Dependencies resolved.
================================================================================
 Package         Architecture Version                        Repository    Size
================================================================================
Installing:
 net-tools       x86_64       2.0-0.52.20160912git.el8       baseos       322 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 322 k
Installed size: 942 k
Downloading Packages:
[MIRROR] net-tools-2.0-0.52.20160912git.el8.x86_64.rpm: Status code: 403 for http://mirrors.tuna.tsinghua.edu.cn/centos/8.4.2105/BaseOS/x86_64/os/Packages/net-tools-2.0-0.52.20160912git.el8.x86_64.rpm (IP: 101.6.15.130)
net-tools-2.0-0.52.20160912git.el8.x86_64.rpm   366 kB/s | 322 kB     00:00
--------------------------------------------------------------------------------
Total                                           224 kB/s | 322 kB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1
  Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64              1/1
  Verifying        : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1

Installed:
  net-tools-2.0-0.52.20160912git.el8.x86_64

Complete!
Removing intermediate container 91a6b1162d17
 ---> b49a35025e97
Step 6/8 : CMD echo $path
 ---> Running in c99bf8478bc8
Removing intermediate container c99bf8478bc8
 ---> 33fb317c3266
Step 7/8 : CMD echo 镜像制作成功 yyds !!!
 ---> Running in d88c0566b61f
Removing intermediate container d88c0566b61f
 ---> 1fb74b9f4b8a
Step 8/8 : CMD /bin/bash
 ---> Running in 3f7becd95978
Removing intermediate container 3f7becd95978
 ---> fc4973078f26
Successfully built fc4973078f26
Successfully tagged mycentos:0.0.1
运行容器

在这里插入图片描述

列出镜像的变更历史

在这里插入图片描述

CMD/ENTRYPOINT 镜像案例
CMD指令
  • 正常情况下,启动tomcat
    在这里插入图片描述
    在Tomcat的dockerfile中,最后的CMD命令是 CMD ["catalina.sh" "run"]

  • 当在命令docker run -it -p 8080:8080 tomcat后面添加 ls -l后打印信息如下:
    在这里插入图片描述
    查看tomcatDockerfile文件内容,由WORKDIR /usr/local/tomcat命令知tomcat的落脚点为/usr/local/tomcat,当在docker run -it -p 8080:8080 tomcat后面添加 ls -l后,由CMD指令的特性:当Dockerfile中存在多个CMD指令的命令时,之后最后一个生效,且cmd指令的命令也可被docker run之后的参数替换,得当执行docker run -it -p 8080:8080 tomcat ls -l 时,tomcat中的 CMD ["catalina.sh" "run"]被替换为CMD ls -l,而且tomcat的落脚点为/usr/local/tomcat,所以ls -l

执行后,是遍历了落脚点下的文件目录。

ENTRYPOINT
  • CMD的Shell模式(没有中括号的形式):命令command默认在默认的shell终端执行

​ CMD给出的是一个容器的默认的可执行体。即容器启动后,默认的执行命令。这表示:如果docker run没有指定任何执行命令或dockerfile里面没有ENTRYPOINT,那么,就会使用CMD指定的默认的执行命令执行。
在这里插入图片描述

# CMD命令测试

#基础镜像
FROM centos

CMD echo "hello cmd!!!"

在这里插入图片描述

# CMD命令测试

#基础镜像
FROM centos

CMD echo "hello cmd!!!"

CMD echo "娃哈哈"

在这里插入图片描述
在这里插入图片描述

  • CMD命令行模式(中括号的形式):第一个参数必须是命令的全路径
# CMD命令测试

#基础镜像
FROM centos

CMD echo "hello cmd!!!"

CMD echo "娃哈哈"

CMD ["/bin/bash","-c","echo 爽歪歪"]

在这里插入图片描述
在这里插入图片描述

  • ENTRYPOINT命令行模式(中括号形式):docker run命令后面有额外参数,那么后面的参数都会作为ENTRYPOINT的参数,如果后面没有额外的参数,但是dockerfile中有CMD,那么CMD的全部内容会被作为ENTRYPOINT的参数。
# CMD命令测试

#基础镜像
FROM centos

ENTRYPOINT ["echo"]
CMD "哈哈哈"

在这里插入图片描述
在这里插入图片描述

  • ENTRYPOINT的shell模式(没有中括号的模式):这种模式下,任何docker run和CMD的参数都无法被传入到ENTRYPOINT中。
# CMD命令测试

#基础镜像
FROM centos

ENTRYPOINT "echo"
CMD "哈哈哈"

在这里插入图片描述
在这里插入图片描述
总结:通常情况下,使用ENTRYPOIN的命令行模式作为docker容器启动以后的默认执行命令,里面放的是不变的部分,可变部分,例如命令参数,可以通过docker run方式提供,也可通过CMD指令提供。使用默认参数直接docker run即可,使用其他参数可以在docker run 后面进行参数传递。

ONBUILD指令
#验证onbuild的父镜像的dockerfile

FROM centos

ONBUILD RUN echo "我是用来验证onbuild的父镜像"

在这里插入图片描述

#验证onbuild的子镜像的dockerfile

FROM father_image

CMD echo "娃哈哈"

在这里插入图片描述

COPY指令和ADD指令

在这里插入图片描述

  1. dockerfile文件内容
    FROM         centos
    MAINTAINER    liang
    #把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
    COPY redme.txt /usr/local/redme.txt
    ##把java与tomcat添加到容器中
    ADD jdk-8u161-linux-x64.tar.gz /usr/local/
    ADD apache-tomcat-9.0.54.tar.gz /usr/local/
    ##设置工作访问时候的WORKDIR路径,登录落脚点
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    ##配置java与tomcat环境变量
    ENV JAVA_HOME /usr/local/jdk1.8.0_161
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.54
    ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.54
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    ##容器运行时监听的端口
    EXPOSE 8080
    #启动时运行tomcat
    ## ENTRYPOINT ["/usr/local/apache-tomcat-9.0.54/bin/startup.sh" ]
    ## CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
    CMD /usr/local/apache-tomcat-9.0.54/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.54/bin/logs/catalina.out
    
  2. 构建镜像

在这里插入图片描述

[root@centos7 mytomcattest]# docker build -f dockerfile -t mytomcattest .
Sending build context to Docker daemon  201.3MB
Step 1/14 : FROM         centos
 ---> 5d0da3dc9764
Step 2/14 : MAINTAINER    liang
 ---> Running in d7a5335f48e4
Removing intermediate container d7a5335f48e4
 ---> 3943e9f060e0
Step 3/14 : COPY redme.txt /usr/local/redme.txt
 ---> 96f5fbba39c1
Step 4/14 : ADD jdk-8u161-linux-x64.tar.gz /usr/local/
 ---> 0db0cffa851b
Step 5/14 : ADD apache-tomcat-9.0.54.tar.gz /usr/local/
 ---> 4f5c4e9e9ad1
Step 6/14 : ENV MYPATH /usr/local
 ---> Running in 7cf581688f4f
Removing intermediate container 7cf581688f4f
 ---> 80b03b44643d
Step 7/14 : WORKDIR $MYPATH
 ---> Running in 52e42e5ad29a
Removing intermediate container 52e42e5ad29a
 ---> e78e3811ee4f
Step 8/14 : ENV JAVA_HOME /usr/local/jdk1.8.0_161
 ---> Running in ab538350850d
Removing intermediate container ab538350850d
 ---> fefc40e6413a
Step 9/14 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 ---> Running in 380bfbdace4e
Removing intermediate container 380bfbdace4e
 ---> 7a8d3f740ca8
Step 10/14 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.54
 ---> Running in 6e8efb91a7ee
Removing intermediate container 6e8efb91a7ee
 ---> 9c1feba42f8a
Step 11/14 : ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.54
 ---> Running in 944baa381c46
Removing intermediate container 944baa381c46
 ---> 864d657d3224
Step 12/14 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 ---> Running in 4b7ffa75a27a
Removing intermediate container 4b7ffa75a27a
 ---> 8566147c47ab
Step 13/14 : EXPOSE 8080
 ---> Running in c6999fd590a3
Removing intermediate container c6999fd590a3
 ---> 780fa1e60a37
Step 14/14 : CMD /usr/local/apache-tomcat-9.0.54/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.54/bin/logs/catalina.out
 ---> Running in 096718aea21f
Removing intermediate container 096718aea21f
 ---> 7570653e34a5
Successfully built 7570653e34a5
Successfully tagged mytomcattest:latest
  1. 运行镜像

在这里插入图片描述

docker run -d -p 9080:8080 --name mytomcattest -v /mytomcattest/tomcat/test:/usr/local/apache-tomcat-9.0.54/webapps/test -v /mytomcattest/tomcat/logs/:/usr/local/apache-tomcat-9.0.54/logs --privileged=true mytomcattest 

在这里插入图片描述
** 欢迎大家关注我的微信公众号。谢谢!**
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值