小工具知识网

当前位置: 首页 > 行业知识 > 【自定义镜像—Dockerfile完全指南】常用的十三种dockerfile指令及构建Tomcat镜像例子

行业知识

【自定义镜像—Dockerfile完全指南】常用的十三种dockerfile指令及构建Tomcat镜像例子

2026-11-13 06:40:09 来源:互联网转载

Dockerfile完全指南

什么是Dockerfile

概述

Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。

基本结构

Dockerfile由一行行命令语句组成,并且支持以 # 开头的注释行。一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

例如:

##  Dockerfile文件格式 # 1、第一行必须指定 基础镜像信息FROM java:8# 2、维护者信息MAINTAINER oldGj_  oldGj_@163.com# 3、镜像操作指令RUN  echo "wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.55/bin/apache-tomcat-9.0.55.tar.gz"run tar -zxvf apache-tomcat-9.0.55.tar.gz -C /usr/local# 4、容器启动执行指令CMD /usr/local/tomcat/bin/catalina.sh

Dockerfile 四部分说明:

  • 一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.
  • 接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.
  • 后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.
  • 最后是CMD指令,来指明运行容器时的操作命令.

    构建镜像

    简单示例

    在一个空白的文本文件, 命名为Dockerfile

    vim  Dockerfile

    示例1

    Dockerfile文件内容:

    #基础镜像FROM centos#维护者MAINTAINER oldGj_#运行命令RUN "yum install wget"#启动容器运行命令CMD echo "hello Dockerfile"

    示例2

    Dockerfile文件内容:

    FROM java:8MAINTAINER WCC CMD java -version

    构建镜像

    docker build -t 镜像名字:版本 . 

    注意

    . 代表Dockerfile文件在当前路径

    常见的13种指令

    FROM

    指定基础镜像,必须为第一个命令。

    指令格式:

    FROM   FROM :  

    注意:

    tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

    MAINTAINER

    维护者信息

    指令格式:

    MAINTAINER 

    示例

     MAINTAINER Jasper Xu   MAINTAINER sorex@163.com  

    WORKDIR

    工作目录,类似于cd命令

    指令格式:

    WORKDIR /usr/workdir

    示例

    WORKDIR /a  (这时工作目录为/a)WORKDIR b  (这时工作目录为/a/b)WORKDIR c  (这时工作目录为/a/b/c)

    示例

    WORKDIR /OPTRUN mkdir dockerWORKDIR /usr/localRUN echo "test" > a.info

    注意: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

    RUN

    构建镜像时执行的命令

    指令语法:

    # 1. shell执行格式 RUN # 2. exec执行格式 RUN ["executable", "param1", "param2"]

    示例

    WORKDIR /OPTRUN mkdir dockerWORKDIR /usr/localRUN echo "test" > a.info

    注意:

    RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定–no-cache参数,如:docker build --no-cache

    ADD

    将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。

    指令格式:

     ADD ...    ADD ["",... ""] 用于支持包含空格的路径示例:  

    示例

    添加所有以"hom"开头的文件

    ADD hom* /mydir/ 

    ? 替代一个单字符,例如:“home.txt”

    ADD hom?.txt /mydir/   

    添加 “test” 到 WORKDIR/relativeDir/

    ADD test relativeDir

    添加 “test” 到 /absoluteDir/

    ADD test /absoluteDir/

    COPY

    功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。

    语法格式:

    COPY   

    示例

    COPY ./start.sh /start.sh

    CMD

    构建容器后调用,也就是在容器启动时才进行调用。指定这个容器启动的时候要运行的命令只有最后一个会生效可被替换。

    指令格式:

    CMD指令与RUN指令相似,也具有两种格式:1. shell格式:CMD 2. exec格式: CMD ["可执行文件", "参数1", "参数2", …]

    示例

    CMD echo "This is a test." | wc -CMD ["/usr/bin/wc","--help"]

    注意: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

    ENTRYPOINT

    配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

    指定容器启动的要运行的命令,可以追加命令

    指令格式:

    ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 (shell内部命令)

    示例

    ENTRYPOINT ["top", "-b"]

    注意:

    ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

    ENV

    这个指令非常简单,就是用于设置环境变量而已,无论是接下来的指令,还是在容器中运行的程序,都可以使用这里定义的环境变量。

    指令格式:

    ENV =

    示例

    ENV JAVA_HOME=/usr/local/jdk1.7.0_79ENV PATH=$JAVA_HOME/bin:$PATH

    EXPOSE

    指定于外界交互的端口

    指令格式:

    EXPOSE

    示例

    EXPOSE 80

    注意:

    EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。

    VOLUME

    用于指定持久化目录

    指令格式:

    VOLUME ["/path/to/dir"]

    示例

    VOLUME ["/data"]VOLUME ["/var/www", "/var/log/apache2"]

    注意:

    一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

    1 卷可以容器间共享和重用2 容器并不一定要和其它容器共享卷3 修改卷后会立即生效4 对卷的修改不会对镜像产生影响5 卷会一直存在,直到没有任何容器在使用它

    USER

    USER指令用于将会用以什么样的用户去运行

    指令格式:

    USER userUSER user:group

    注意:

    使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

    ONBUILD

    帮助别人定制而准备的

    指令格式:

    ONBUILD [INSTRUCTION]

    示例

    FROM centosWORKDIR /dataONBUILD RUN mkdir testFROM test:02

    CMD和ENTRYPOINT的区别

    区别:

    • CMD #指定这个容器启动的时候要运行的命令,可被替换
    • ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令

      例子

      Dockerfile文件

      #基础镜像from centos#启动容器运行命令CMD ["ls" ,"-a"]

      构建镜像

      docker build -t test04:v1 .

      Dockerfile综合实验

      构建Tomcat镜像

      首先,尝试在DockerHub上搜索Tomcat相关镜像的个数

      docker search tomcat |wc -l

      有26个,如果是个人开发或者测试,随意使用一个,若是生产环境使用,就不合适了。

      • 项目需要的Tomcat版本可能不同。
      • 项目需要的Tomcat变量不一致。
      • 项目需要的JDK可能不一致。

        因此比较好的方式有架构师或者项目经理通过Dockerfile或者其他方法构建统一的镜像,然后分发给项目组所有成员来进行。

        构建步骤

        1. 编写一个dockerfile 文件
        2. docker build构建成为一个镜像
        3. docker run运行镜像

        Dockerfile文件

        #基础镜像FROM  openjdk:11#维护者MAINTAINER oldGj_#拷贝tomcat包ADD  ./apache-tomcat-9.0.50.tar.gz /usr/local#设置工作目录WORKDIR /usr/local#设置tomcat环境变量ENV TOMCAT_HOME=/usr/local/apache-tomcat-9.0.50ENV PATH=$PATH:$TOMCAT_HOME/bin#保留端口EXPOSE 8080#启动容器运行命令CMD startup.sh && tail -F /usr/local/apache-tomcat-9.0.50/bin/catalina.bat

上一篇:侠盗飞车下载指南,步骤与技巧

下一篇:揭秘云购app源码,高效便捷购物新体验探秘!