DockerFile 文件常用详解

  • FROM:指定基础镜像,必须为第一个命令

    1
    2
    3
    4
    5
    6
    7
    8
    格式:
      FROM <image>
      FROM <image>:<tag>
      FROM <image>@<digest>
    示例:
      FROM centos:7.2.1511
    注:
      tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
  • MAINTAINER:维护者信息

    1
    2
    3
    4
    5
    6
    格式:
    MAINTAINER <name>
    示例:
    MAINTAINER caijinkun
    MAINTAINER caijinkun <caijinkun@mastercom.cn>
    MAINTAINER caijinkun "caijinkun@mastercom.cn"
  • RUN:构建镜像时执行的命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
    shell执行
    格式:
    RUN <command>
    exec执行
    格式:
    RUN ["executable", "param1", "param2"]
    示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
    注:
      RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
    可以在构建时指定--no-cache参数,如:docker build --no-cache
    每执行Run命令,都会创建一个中间镜像层,使得最终创建的镜像文件变大,建议把命令都在一个Run中执行,用&&分隔.
  • ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
    示例:
    ADD hom* /mydir/ # 添加所有以"hom"开头的文件
    ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
    ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
    注:
    该命令只能添加Dockerfile路径的下层文件,所以需要事先拷贝文件到该路径下
  • COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源,建议直接用ADD

  • CMD:构建容器后调用,也就是在容器启动时才进行调用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    格式:
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
    示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]
    CMD ["java","-jar","mtex-config-0.0.1-SNAPSHOT.jar"]
    注:
      CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令
  • ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去”application”,只使用参数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
    示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
    注:
      ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT
    而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT
    Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
  • ENV:设置环境变量

    1
    2
    3
    4
    5
    6
    7
    格式:
    ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
    ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
    示例:
    ENV myName John Doe
    ENV myDog Rex The Dog
    ENV myCat=fluffy
  • EXPOSE:指定于外界交互的端口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    格式:
    EXPOSE <port> [<port>...]
    示例:
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp
    注:
      EXPOSE并不会让容器的端口访问到主机。要使其可访问
    需要在docker run 运行容器时通过 -p 来发布这些端口
    或通过 -P 参数来发布EXPOSE导出的所有端口
  • VOLUME:用于指定持久化目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    格式:
    VOLUME ["path"]
    示例:
    VOLUME ["/data","/home"]
    注:
    和docker run -v 的区别是无法挂载指定的目录.
    一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
    1.卷可以容器间共享和重用
    2.容器并不一定要和其它容器共享卷
    3.修改卷后会立即生效
    4.对卷的修改不会对镜像产生影响
    5.卷会一直存在,直到没有任何容器在使用它
  • WORKDIR:工作目录,类似于cd命令

    1
    2
    3
    4
    5
    6
    7
    8
    格式:
    WORKDIR path
    示例:
    WORKDIR /home (这时工作目录为/home)
    WORKDIR jenkins-running-jar (这时工作目录为/home/jenkins-running-jar)
    注:
      通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
    在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

docker 执行DockerFile创建镜像

基础镜像

  1. docker pull centos:7.2.1511先从仓库中拉取一个centos7.2的系统,来作为最底层的镜像
  2. 先下载 jre-8u201-linux-x64.tar.gz 下载地址 以此为基础创建一个具备java环境的基础镜像
  3. 这里使用jre而非jdk,主要是为了降低镜像大小。
  4. 这里注意需要引入镜像的文件必须与Dockerfile路径同级或下级

jre-8u201-linux-x64.tar.gz文件路径下 vi Dockerfile 创建镜像,拷贝以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#使用的基础镜像
FROM centos:7.2.1511
#作者信息
MAINTAINER caijinkun "caijinkun@mastercom.cn"

#安装中文和zip支持
RUN yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common && yum -y install unzip zip && yum clean all && localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
#加入jre
ADD jre-8u201-linux-x64.tar.gz /usr/local/

#设置环境变量
ENV JAVA_HOME /usr/local/jre1.8.0_201
ENV PATH $JAVA_HOME/bin:$PATH
ENV LC_ALL zh_CN.utf8
ENV TZ Asia/Shanghai

执行Dockfile文件 docker build -t java:jre1.8.0.201 . 并检查镜像创建是否成功docker images java

mtex-config镜像

基础镜像已经完毕,准备创建程序的DockerFile和程序,这里以mtex-config为例

1
2
3
4
5
6
7
8
9
10
11
12
13
#使用的基础镜像
FROM java:jre1.8.0.201
#作者信息
MAINTAINER caijinkun "caijinkun@mastercom.cn"
#加入服务
ADD mtex-config-0.0.1-SNAPSHOT.zip tmp.zip
RUN mkdir -p /home/jenkins-running-jar/mtex-config/ && unzip -o tmp.zip -d /home/jenkins-running-jar/mtex-config/ && rm -f tmp.zip && rm -rf /home/jenkins-running-jar/mtex-config/properties &&rm -rf /home/jenkins-running-jar/mtex-config/properties_*

#工作目录
WORKDIR /home/jenkins-running-jar/mtex-config/

#启动服务
CMD ["nohup","java","-jar","mtex-config-0.0.1-SNAPSHOT.jar"]

这里需要引入自身的配置文件夹,所以把压缩包引入镜像后先删除原配置文件夹.待使用docker启动时将自身配置文件挂载进去,也可以使用其他方式.

使用docker启动mtex-config,这里pro-properties是我自身的配置文件夹名称,这里挂载到主机的是linux自带的日志,可自行进行log日志挂载

1
docker run --name mtex-config -tid --privileged=true --restart=always --net=host -v /home/jenkins-running-jar/mtex-config/pro-properties:/home/jenkins-running-jar/mtex-config/properties/ -v /home/file/nohupLog/mtex-config.log:/home/jenkins-running-jar/mtex-config/nohup.out mtex-config

启动容器时把自身的配置文件夹挂载到容器中即可.--net=host代表和主机使用同一个网段,即同一个IP和端口.

如果打算通过-p进行端口映射,需要先在启宿主机的防火墙上开启该端口,并对外暴露.

mtex-sys镜像

程序镜像基本都类似,都是根据业务要求挂载不同的文件即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
#使用的基础镜像
FROM java:jre1.8.0.201
#作者信息
MAINTAINER caijinkun "caijinkun@mastercom.cn"
#加入服务
ADD mtex-sys-0.0.1-SNAPSHOT.zip tmp.zip
RUN mkdir -p /home/jenkins-running-jar/mtex-sys/ && unzip -o tmp.zip -d /home/jenkins-running-jar/mtex-sys/ && rm -f tmp.zip

#工作目录
WORKDIR /home/jenkins-running-jar/mtex-sys/

#启动服务
CMD ["nohup","java","-jar","mtex-sys-0.0.1-SNAPSHOT.jar"]

docker启动mtex-sys实例:

1
docker run --name mtex-sys -tid --privileged=true --restart=always --net=host -v /home/file/nohupLog/mtex-sys.log:/home/jenkins-running-jar/mtex-sys/nohup.out mtex-sys

这时要注意,sys作为框架需要访问很多个项目的文件夹配置及路径,根据需求进行挂载,或者弄一个项目的共享文件夹即可.

最后更新: 2020年05月26日 17:39

原始链接: https://midkuro.gitee.io/2020/05/21/docker-dockfile/

× 请我吃糖~
打赏二维码