zoukankan      html  css  js  c++  java
  • Dockerfile详解


    自制镜像:

    基于dockerfile文件制作镜像使用

    Dockerfile中可以用到的环境变量

    ${variable_name}

    变量替换的特殊格式

    ${variable:-word}

    如果这个变量未初始化,或者有这个变量但是值为空,这表示我要引用的是word这个字串所表示的内容。

    ${variable:+word}

    与-号相反,变量有值就替换变量,为空就不做操作

    ${variable:-word}示例

    [root@localhost ~]# echo ${NAME:-tom}
    tom
    [root@localhost ~]# NAME=jerry
    [root@localhost ~]# echo ${NAME:-tom}
    jerry
    

    ${variable:+word示例

    [root@localhost ~]# echo $NAME
    jerry
    [root@localhost ~]# echo ${NAME:+tom}
    tom
    [root@localhost ~]# unset NAME
    [root@localhost ~]# echo ${NAME:+tom}
    [root@localhost ~]# echo $NAME
    
    

    Dockerfile详解

    [root@localhost ~]# mkdir  img1
    [root@localhost ~]# cd img1/
    [root@localhost img1]# vi Dockerfile
    文件名的首字母必须为大写
    

    复制于百衲本

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

    MAINTAINER: 维护者信息,还可以使用LABEL指定各种元格式指定maintainer

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

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

    WORKDIR:工作目录,类似于cd命令

    VOLUME :用于指定持久化目录(指定卷,注意在dockerfile中只能指定基于docker管理的卷)

    EXPOSE:用于为容器打开指定要监听的端口以实现与外部通信

    ENV:设置环境变量,用于为镜像定义所需的环境变量,并可被dockerfile文件中位于其后的其他指令所调用

    RUN:构建镜像时执行的命令

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

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

    USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户**

    HEALTHCHECK:健康检查

    ARG:用于指定传递给构建运行时的变量

    FROM

    FROM指令是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境

    实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会从docker Hub Registry上拉取所需的镜像文件

    格式:
      FROM <image>
      FROM <image>:<tag>
      FROM <image>@<digest>
    示例:
      FROM mysql:5.6
    注:
      tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
    

    MAINTAINER: 维护者信息

    格式:
        MAINTAINER <name>
    示例:
        MAINTAINER Jasper Xu
        MAINTAINER sorex@163.com
        MAINTAINER Jasper Xu <sorex@163.com>
    

    LABEL

    指定各种元数据。

    LABEL maintainer=“MageEdu <mageNAME <docker@keji.com>>”
    

    COPY

    copy文件

    copy目录

    用于从Docker主机复制文件至创建的新映像文件

    格式:
        COPY <src>... <dest>
        COPY ["<src>",... "<dest>"] 用于支持包含空格的路径
         <src>:要复制的源文件或目录,支持使用通配符
         <dest>:目标路径,即正在创建的image的文件系统路径;建议为<dest>使用绝对路径,否则,COPY指定则以WORKDIR为其起始路径;
          注意:在路径中有空白字符时,通常使用第二种格式
    文件复制准则
     <src>必须是build上下文中的路径,不能是其父目录中的文件
     如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制
     如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾
     如果<dest>事先不存在,他将会被自动创建,这包括其父目录路径
    

    copy文件

    [root@localhost ~]# mkdir  img1
    [root@localhost ~]# cd img1/
    [root@localhost img1]# vi Dockerfile
    文件名的首字母必须为大写
    # Description: test image
    FROM busybox:latest
    MAINTAINER "NAME <docker@keji.com>"
    #LABEL maintainer=“MageEdu <mageNAME <docker@keji.com>>”
    COPY index.html /data/web/html/index.html
    ~    
    index.html此文件需在Dockerfile文件同目录中
    

    创建文件

    [root@localhost img1]# vi index.html
    <h1>Busybox httpd server.</h1>
    [root@localhost img1]# ls
    Dockerfile  index.html
    

    创建镜像

    docker build

    [root@localhost img1]# docker build -t tinyhttpd:v0.0-1 ./
    Sending build context to Docker daemon  3.072kB
    Step 1/3 : FROM busybox:latest
     ---> 19485c79a9bb
    Step 2/3 : MAINTAINER "NAME<docker@keji.com>"
     ---> Running in 2057d1f2731e
    Removing intermediate container 2057d1f2731e
     ---> c98bfa70ce79
    Step 3/3 : COPY index.html /data/web/html/index.html
     ---> ebd7af0b04b2
    Successfully built ebd7af0b04b2
    Successfully tagged tinyhttpd:v0.0-1
    [root@localhost img1]# docker images
    REPOSITORY           TAG                 IMAGE ID            CREATED              SIZE
    tinyhttpd            v0.0-1              ebd7af0b04b2        About a minute ago   1.22MB
    

    -t 表示指定标签

    copy目录

    [root@localhost ~]# mkdir imgl
    [root@localhost ~]# cd imgl/
    [root@localhost imgl]# vi Dockerfile
    
    # Description: test image
    FROM busybox:latest
    LABEL maintainer "NAME <docker@keji.com>"
    COPY yum.repos.d /etc/yum.repos.d/
    ~   
    
    创建目录在与Dockerfile同目录
    [root@localhost imgl]# cp -r /etc/yum.repos.d/ ./yum.repos.d
    [root@localhost imgl]# ls
    Dockerfile  yum.repos.d
    

    docker build制作镜像

    [root@localhost imgl]# docker build -t tinyhttpd:v0.1-1 ./
    Sending build context to Docker daemon   21.5kB
    Step 1/3 : FROM busybox:latest
     ---> 19485c79a9bb
    Step 2/3 : LABEL maintainer "NAME <docker@keji.com>"
     ---> Running in 879242f88631
    Removing intermediate container 879242f88631
     ---> 0f768995dae1
    Step 3/3 : COPY yum.repos.d /etc/yum.repos.d/
     ---> 626da90932c0
    Successfully built 626da90932c0
    Successfully tagged tinyhttpd:v0.1-1
    [root@localhost imgl]# docker images
    REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
    tinyhttpd            v0.1-1              626da90932c0        5 seconds ago       1.23MB
    

    启动镜像并验证

    [root@localhost imgl]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-1 ls /etc/yum.repos.d
    CentOS-Base.repo
    CentOS-CR.repo
    CentOS-Debuginfo.repo
    CentOS-Media.repo
    CentOS-Sources.repo
    CentOS-Vault.repo
    CentOS-fasttrack.repo
    docker-ce.repo
    
    

    ADD

    向目标镜像中打包文件

    网络中下载不展开

    [root@localhost imgl]# vi Dockerfile 
    
    # Description: test image
    FROM busybox:latest
    LABEL maintainer "NAME <docker@keji.com>"
    COPY yum.repos.d /etc/yum.repos.d/
    ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
    

    制造镜像

    [root@localhost imgl]# docker build -t tinyhttpd:v0.1-3 ./
    Sending build context to Docker daemon   21.5kB
    Step 1/4 : FROM busybox:latest
     ---> 19485c79a9bb
    Step 2/4 : LABEL maintainer "NAME <docker@keji.com>"
     ---> Using cache
     ---> 0f768995dae1
    Step 3/4 : COPY yum.repos.d /etc/yum.repos.d/
     ---> Using cache
     ---> 626da90932c0
    Step 4/4 : ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
    Downloading [==================================================>]  1.035MB/1.035MB
     ---> 145383f48613
    Successfully built 145383f48613
    Successfully tagged tinyhttpd:v0.1-3
    [root@localhost imgl]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-3 ls /usr/local/src
    nginx-1.17.3.tar.gz
    
    

    启动容器并验证

    [root@localhost imgl]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-3 ls /usr/local/src
    nginx-1.17.3.tar.gz
    

    本地tar文件在镜像中展开

    [root@localhost imgl]# wget http://nginx.org/download/nginx-1.17.3.tar.gz
    --2019-09-14 21:25:53--  http://nginx.org/download/nginx-1.17.3.tar.gz
    正在解析主机 nginx.org (nginx.org)... 62.210.92.35, 95.211.80.227, 2001:1af8:4060:a004:21::e3
    正在连接 nginx.org (nginx.org)|62.210.92.35|:80... 已连接。
    已发出 HTTP 请求,正在等待回应... 200 OK
    长度:1034586 (1010K) [application/octet-stream]
    正在保存至: “nginx-1.17.3.tar.gz”
    
    100%[=========================================================================================>] 1,034,586   6.40KB/s 用时 2m 16s 
    
    2019-09-14 21:28:12 (7.43 KB/s) - 已保存 “nginx-1.17.3.tar.gz” [1034586/1034586])
    
    [root@localhost imgl]# ls
    Dockerfile  nginx-1.17.3.tar.gz  yum.repos.d
    
    [root@localhost imgl]# vi Dockerfile 
    
    # Description: test image
    FROM busybox:latest
    LABEL maintainer "NAME <docker@keji.com>"
    COPY yum.repos.d /etc/yum.repos.d/
    # ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
    ADD nginx-1.17.3.tar.gz /usr/local/src/
    ~                                              
    

    制作镜像

    [root@localhost imgl]# docker build -t tinyhttpd:v0.1-4 ./
    Sending build context to Docker daemon  1.057MB
    Step 1/4 : FROM busybox:latest
     ---> 19485c79a9bb
    Step 2/4 : LABEL maintainer "NAME <docker@keji.com>"
     ---> Using cache
     ---> 0f768995dae1
    Step 3/4 : COPY yum.repos.d /etc/yum.repos.d/
     ---> Using cache
     ---> 626da90932c0
    Step 4/4 : ADD nginx-1.17.3.tar.gz /usr/local/src/
     ---> f5bd86111d4e
    Successfully built f5bd86111d4e
    Successfully tagged tinyhttpd:v0.1-4
    [root@localhost imgl]# docker images
    REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
    tinyhttpd            v0.1-4              f5bd86111d4e        9 seconds ago       7.45MB
    

    启动容器并验证

    [root@localhost imgl]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-4 ls /usr/local/src
    nginx-1.17.3
    [root@localhost imgl]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-4 ls /usr/local/src/nginx-1.17.3
    CHANGES
    CHANGES.ru
    LICENSE
    README
    auto
    conf
    configure
    contrib
    html
    man
    src
    

    WORKDIR

    格式:
        WORKDIR /path/to/workdir
    示例:
        WORKDIR /a  (这时工作目录为/a)
        WORKDIR b  (这时工作目录为/a/b)
        WORKDIR c  (这时工作目录为/a/b/c)
    注:
      通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
    

    VOLUME
    格式:
        VOLUME ["/path/to/dir"]
    示例:
        VOLUME ["/data"]
        VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
    注:
      一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
    卷可以容器间共享和重用
    容器并不一定要和其它容器共享卷
    修改卷后会立即生效
    对卷的修改不会对镜像产生影响
    卷会一直存在,直到没有任何容器在使用它
    
    [root@localhost imgl]# vi Dockerfile 
    
    # Description: test image
    FROM busybox:latest
    LABEL maintainer "NAME <docker@keji.com>"
    COPY yum.repos.d /etc/yum.repos.d/
    # ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
    ADD nginx-1.17.3.tar.gz /usr/local/src/
    VOLUME /data/mysql
    

    制作镜像

    [root@localhost imgl]# docker build -t tinyhttpd:v0.1-5 ./
    Step 1/5 : FROM busybox:latest
     ---> 19485c79a9bb
    Step 2/5 : LABEL maintainer "NAME <docker@keji.com>"
     ---> Using cache
     ---> 0f768995dae1
    Step 3/5 : COPY yum.repos.d /etc/yum.repos.d/
     ---> Using cache
     ---> 626da90932c0
    Step 4/5 : ADD nginx-1.17.3.tar.gz /usr/local/src/
     ---> Using cache
     ---> f5bd86111d4e
    Step 5/5 : VOLUME /data/mysql
     ---> Running in dc15cb73e8a9
    Removing intermediate container dc15cb73e8a9
     ---> c75c81aed62b
    Successfully built c75c81aed62b
    Successfully tagged tinyhttpd:v0.1-5
    

    启动容器并验证

    [root@localhost imgl]# docker run --name tinyweb1 -it  --rm tinyhttpd:v0.1-5 
    / # 
    
    在另外终端查看
    [root@localhost ~]# docker inspect tinyweb1
    "Mounts": [
                {
                    "Source": "/var/lib/docker/volumes/a758fa7908a75168cc68b772deb1cb8693a167039ee0757f8853c0b0095be7ef/_data",
                    "Destination": "/data/mysql",
                }
            ],
    
    

    EXPOSE

    格式:
        EXPOSE <port> [<port>...]
    示例:
        EXPOSE 80 443
        EXPOSE 8080
        EXPOSE 11211/tcp 11211/udp
    注:
      EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
      镜像中指定的是待暴露的端口是隐藏的,需要加上大写的-P选项,也可以自定义
    

    dockerfile

    [root@localhost imgl]# vi Dockerfile 
    # Description: test image
    FROM busybox:latest
    LABEL maintainer "NAME <docker@keji.com>"
    COPY index.html /data/web/index.html
    COPY yum.repos.d /etc/yum.repos.d/
    # ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
    ADD nginx-1.17.3.tar.gz /usr/local/src/
    VOLUME /data/mysql
    EXPOSE  80/tcp
    ~      
    暴露80端口默认是tcp协议,copy了一个网页进行验证,需要于Dockerfile同目录,或同目录下的子目录
    

    制作镜像

    [root@localhost imgl]# docker build -t tinyhttpd:v0.1-7 ./
    Sending build context to Docker daemon  1.058MB
    Step 1/7 : FROM busybox:latest
     ---> 19485c79a9bb
    Step 2/7 : LABEL maintainer "NAME <docker@keji.com>"
     ---> Using cache
     ---> 0f768995dae1
    Step 3/7 : COPY index.html /data/web/index.html
     ---> Using cache
     ---> 8521e27a3994
    Step 4/7 : COPY yum.repos.d /etc/yum.repos.d/
     ---> Using cache
     ---> 9febae27cad9
    Step 5/7 : ADD nginx-1.17.3.tar.gz /usr/local/src/
     ---> Using cache
     ---> a0519d8ae3e2
    Step 6/7 : VOLUME /data/mysql
     ---> Using cache
     ---> e6760563c20f
    Step 7/7 : EXPOSE  80/tcp
     ---> Using cache
     ---> b2d39a1470a1
    Successfully built b2d39a1470a1
    Successfully tagged tinyhttpd:v0.1-7
    [root@localhost imgl]# docker images
    REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
    tinyhttpd            v0.1-6              b2d39a1470a1        13 minutes ago      7.45MB
    tinyhttpd            v0.1-7              b2d39a1470a1        13 minutes ago      7.45MB
    

    运行并验证

    [root@localhost imgl]# docker run --name httpdweb --rm -P tinyhttpd:v0.1-7 /bin/httpd -f -h /data/web 
    
    -P 暴露默认端口
    -f 运行在前端
    -h 指定家目录
    
    [root@localhost ~]# docker port httpdweb
    80/tcp -> 0.0.0.0:32770
    
    http://10.192.45.116:32768/
    

    ENV

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

    dockerfile

    # Description: test image
    FROM busybox:latest
    LABEL maintainer "NAME <docker@keji.com>"
    ENV DOC_ROOT=/data/web/ 
        WEB_SERVER_PACKAGE="nginx-1.17.3"
    
    COPY index.html ${DOC_ROOT:-/data/web/}
    
    COPY yum.repos.d /etc/yum.repos.d/
    WORKDIR /usr/local/
    
    # ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
    ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
    VOLUME /data/mysql
    EXPOSE  80/tcp
    
    

    制作镜像

    [root@localhost imgl]# docker build -t tinyhttpd:v0.1-8 ./
    Sending build context to Docker daemon  1.058MB
    Step 1/9 : FROM busybox:latest
     ---> 19485c79a9bb
    Step 2/9 : LABEL maintainer "NAME <docker@keji.com>"
     ---> Using cache
     ---> 0f768995dae1
    Step 3/9 : ENV DOC_ROOT=/data/web/     WEB_SERVER_PACKAGE="nginx-1.17.3"
     ---> Running in d976bf7233c8
    Removing intermediate container d976bf7233c8
     ---> 71dc4801559c
    Step 4/9 : COPY index.html ${DOC_ROOT:-/data/web/}
     ---> dab455e62922
    Step 5/9 : COPY yum.repos.d /etc/yum.repos.d/
     ---> 30c10785b714
    Step 6/9 : WORKDIR /usr/local/
     ---> Running in 76a92f61a2ae
    Removing intermediate container 76a92f61a2ae
     ---> 644c7b723bda
    Step 7/9 : ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
     ---> 1d16cc6a864f
    Step 8/9 : VOLUME /data/mysql
     ---> Running in 704a53c80b1b
    Removing intermediate container 704a53c80b1b
     ---> 73ea028f2145
    Step 9/9 : EXPOSE  80/tcp
     ---> Running in e683b674553a
    Removing intermediate container e683b674553a
     ---> 73e4840154b7
    Successfully built 73e4840154b7
    Successfully tagged tinyhttpd:v0.1-8
    
    [root@localhost imgl]# docker images
    REPOSITORY           TAG                 IMAGE ID            CREATED              SIZE
    tinyhttpd            v0.1-8              73e4840154b7        About a minute ago   7.45MB
    

    运行并验证

    [root@localhost imgl]# docker run  --name tinyweb  --rm -P  tinyhttpd:v0.1-8 ls /data/web/
    index.html
    [root@localhost imgl]# docker run  --name tinyweb  --rm -P  tinyhttpd:v0.1-8 ls /usr/local/src/nginx-1.17.3
    CHANGES
    CHANGES.ru
    LICENSE
    README
    auto
    conf
    configure
    contrib
    html
    man
    src
    
    

    -e选项在镜像运行为容器的时候,指定环境变量

    [root@localhost imgl]# docker run  --name tinyweb  --rm -P   tinyhttpd:v0.1-8 printenv
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=6e5e5ba21ac4
    DOC_ROOT=/data/web/
    WEB_SERVER_PACKAGE=nginx-1.17.3
    HOME=/root
    [root@localhost imgl]# docker run  --name tinyweb  --rm -P  -e WEB_SERVER_PACKAGE="1.17.1" tinyhttpd:v0.1-8 printenv
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=0764df783724
    WEB_SERVER_PACKAGE=1.17.1
    DOC_ROOT=/data/web/
    HOME=/root
    
    printenv 显示环境变量
    

    RUN

    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
      基于基础镜像执行,在操作时评估好基础镜像的能力
      注意:json数组中,要使用双引号
    

    示例

    # Description: test image
    FROM busybox:latest
    LABEL maintainer "NAME <docker@keji.com>"
    ENV DOC_ROOT=/data/web/ 
        WEB_SERVER_PACKAGE="nginx-1.17.3"
    
    COPY index.html ${DOC_ROOT:-/data/web/}
    
    COPY yum.repos.d /etc/yum.repos.d/
    WORKDIR /usr/local/
    
     ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
    # ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
    VOLUME /data/mysql
    EXPOSE  80/tcp
    RUN cd /usr/local/src&& 
        tar xf ${WEB_SERVER_PACKAGE}.tar.gz
    ~                                                 
    

    制作镜像

    [root@localhost imgl]# docker build -t tinyhttpd:v0.1-10 ./
    Sending build context to Docker daemon  1.058MB
    Step 1/10 : FROM busybox:latest
     ---> 19485c79a9bb
    Step 2/10 : LABEL maintainer "NAME <docker@keji.com>"
     ---> Using cache
     ---> 0f768995dae1
    Step 3/10 : ENV DOC_ROOT=/data/web/     WEB_SERVER_PACKAGE="nginx-1.17.3"
     ---> Using cache
     ---> 71dc4801559c
    Step 4/10 : COPY index.html ${DOC_ROOT:-/data/web/}
     ---> Using cache
     ---> dab455e62922
    Step 5/10 : COPY yum.repos.d /etc/yum.repos.d/
     ---> Using cache
     ---> 30c10785b714
    Step 6/10 : WORKDIR /usr/local/
     ---> Using cache
     ---> 644c7b723bda
    Step 7/10 : ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
    Downloading [==================================================>]  1.035MB/1.035MB
     ---> Using cache
     ---> 44bafbe3806f
    Step 8/10 : VOLUME /data/mysql
     ---> Using cache
     ---> 6e1c6d12fbf0
    Step 9/10 : EXPOSE  80/tcp
     ---> Using cache
     ---> 27a046c4a773
    Step 10/10 : RUN cd /usr/local/src&&     tar xf ${WEB_SERVER_PACKAGE}.tar.gz
     ---> Running in e97e7b13b137
    Removing intermediate container e97e7b13b137
     ---> 60184a9e0e89
    Successfully built 60184a9e0e89
    Successfully tagged tinyhttpd:v0.1-10
    
    

    运行并验证

    [root@localhost imgl]# docker run  --name tinyweb  --rm -P  -e   WEB_SERVER_PACKAGE="1.17.1" -it tinyhttpd:v0.1-10
    /usr/local # cd src/
    /usr/local/src # ls
    nginx-1.17.3         nginx-1.17.3.tar.gz
    

    CMD

    格式:
        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不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
    

    dockerfile

    [root@localhost ~]# mkdir img2
    [root@localhost ~]# cd img2
    [root@localhost img2]# vi Dockerfile
    
    FROM busybox
    LABEL maintainer="NAME <docker@keji.com>" app="httpd"
    ENV WEB_DOC_ROOT="/data/web/html"
    
    RUN mkdir -p $WEB_DOC_ROOT &&  
        echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html
    
    CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
    

    创建镜像

    [root@localhost img2]#  docker build -t tinyhttpd:v0.2.1 ./
    Sending build context to Docker daemon  2.048kB
    Step 1/5 : FROM busybox
     ---> 19485c79a9bb
    Step 2/5 : LABEL maintainer="NAME <docker@keji.com>" app="httpd"
     ---> Running in dfd6762f6978
    Removing intermediate container dfd6762f6978
     ---> f0cd456477dd
    Step 3/5 : ENV WEB_DOC_ROOT="/data/web/html"
     ---> Running in 3f13bb25c496
    Removing intermediate container 3f13bb25c496
     ---> 12393ad7a5e6
    Step 4/5 : RUN mkdir -p $WEB_DOC_ROOT &&     echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html
     ---> Running in 94982e844a96
    Removing intermediate container 94982e844a96
     ---> 84fa7d468dc4
    Step 5/5 : CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
     ---> Running in 818d47fd2c75
    Removing intermediate container 818d47fd2c75
     ---> 1d1dbe0f701c
    Successfully built 1d1dbe0f701c
    Successfully tagged tinyhttpd:v0.2.1
    [root@localhost img2]# docker images
    REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
    tinyhttpd            v0.2.1              1d1dbe0f701c        23 seconds ago      1.22MB
    

    运行并验证

    [root@localhost img2]# docker run --name tinyweb2 -it --rm tinyhttpd:v0.2.1
    
    [root@localhost imgl]# docker exec -it tinyweb2 /bin/sh
    / # ps
    PID   USER     TIME  COMMAND
        1 root      0:00 /bin/httpd -f -h /data/web/html
        6 root      0:00 /bin/sh
       11 root      0:00 ps
    / # printenv
    WEB_DOC_ROOT=/data/web/html
    HOSTNAME=b378518b9b00
    SHLVL=1
    HOME=/root
    TERM=xterm
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    PWD=/
    
    init第一个进程不是bash而是/bin/httpd
    
    [root@localhost imgl]# docker inspect tinyweb2
     "Cmd": [
                    "/bin/sh",
                    "-c",
                    "/bin/httpd -f -h ${WEB_DOC_ROOT}"
    
    

    ENTRYPOINT

    格式:
        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指令。
    

    dockerfile

    [root@localhost ~]# mkdir img3
    [root@localhost ~]# cd img3
    [root@localhost ~]# vi Dockerfile
    
    FROM nginx:1.14-alpine
    LABEL maintainer="NAME <docker@keji.com>"
    
    ENV NGX_DOC_ROOT='/data/web/html/'
    
    ADD index.html ${NGX_DOC_ROOT}
    
    ADD entrypoint.sh  /bin/
    
    CMD ["/usr/sbin/nginx","-g","daemon off;"]
    
    ENTRYPOINT ["/bin/entrypoint.sh"]
    
    
    index.html文件
    [root@localhost img3]# vi index.html
    <h1>New Ooc Root for Nginx</h1>
    
    
    创建并配置脚本,
    [root@localhost img3]# vi entrypoint.sh
    
    #!/bin/sh
    #
    cat > /etc/nginx/conf.d/www.conf << EOF
    server {
           server_name ${HOSTNAME};
           listen ${IP:-0.0.0.0}:${PORT:-80};
           root ${NGX_DOC_ROOT:-/usr/share/nginx/html};
    }
    EOF
    
    exec "$@"
    
    [root@localhost img3]# chmod +x entrypoint.sh 
    
    

    制作镜像

    [root@localhost img3]# docker build -t tinyhttpd:v0.3-8 ./
    Sending build context to Docker daemon  4.096kB
    Step 1/7 : FROM nginx:1.14-alpine
     ---> 8a2fb25a19f5
    Step 2/7 : LABEL maintainer="NAME <docker@keji.com>"
     ---> Using cache
     ---> ec65bc50b2fa
    Step 3/7 : ENV NGX_DOC_ROOT='/data/web/html/'
     ---> Using cache
     ---> 441c1592ab8a
    Step 4/7 : ADD index.html ${NGX_DOC_ROOT}
     ---> d06aafca9494
    Step 5/7 : ADD entrypoint.sh  /bin/
     ---> 3cf8c5d7e035
    Step 6/7 : CMD ["/usr/sbin/nginx","-g","daemon off;"]
     ---> Running in 55b3e02aefc8
    Removing intermediate container 55b3e02aefc8
     ---> ff948e57325b
    Step 7/7 : ENTRYPOINT ["/bin/entrypoint.sh"]
     ---> Running in 7b27e8d7ea6e
    Removing intermediate container 7b27e8d7ea6e
     ---> c851f6636299
    Successfully built c851f6636299
    Successfully tagged tinyhttpd:v0.3-8
    

    运行并验证

    [root@localhost img3]# docker run --name myweb1 --rm -P -e "PORT=8080" tinyhttpd:v0.3-8
    
    [root@localhost img3]# docker exec -it myweb1 /bin/sh
    / # netstat -tnl
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       
    tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN 
    
    [root@localhost img3]#  docker inspect -f {{.NetworkSettings.Networks.bridge.IPAddress}} myweb1
    10.0.0.5
    [root@localhost img3]# curl 10.0.0.5:8080
    <h1> New Ooc Root for Nginx</h1>
    
    

    USER

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

    HEALTHCHECK

    健康检查
      HEALTHCHECK指令告诉Docker如何测试容器以检查它是否仍在工作。
      即使服务器进程仍在运行,这也可以检测到陷入无限循环且无法处理新连接的Web服务器等情况。
      HEALTHCHECK指令有两种形式:I HEALTHCHECK IOPTIONSI CMD命令(通过在容器内运行命令来检查容器运行状况)
      HEALTHCHECK NONE(禁用从基础图像继承的任何健康检查)
     
    健康检查(2)
      可以在CMD之前出现的选项是:
           --interval = DURATION(默认值:30s)每隔多长时间
           --timeout = DURATION(默认值:30秒)超时时长
           --start-period = DURATION(默认值:Os)等待主进程启动起来后,在进行检测,等待时长
            --retries=N(默认值:3)检查次数
       命令的退出状态表示容器的运行状况。 可能的值是:
        0:成功 - 容器健康且随时可用
        1:不健康 - 容器无法正常工作
        2:保留 - 不要使用此退出代码
       例如
        健康检查 - 间隔= 5M - 超时=3秒
        HEALTHCHECK --interval=5m --timeout=3s 
             CMD curl -f http:// localhost / || exit 1
    

    dockerfile

    FROM nginx
    RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
    HEALTHCHECK --interval=5s --timeout=3s 
      CMD curl -fs http://localhost/ || exit 1
    

    构建镜像

    $ docker build -t myweb:v1
    

    运行容器并验证

    $ docker run -d --name web -p 80:80 myweb:v1
    
    $ docker container ls
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS               NAMES
    03e28eb00bd0        myweb:v1            "nginx -g 'daemon off"   3 seconds ago       Up 2 seconds (health: starting)   80/tcp, 443/tcp     web
    
    当运行该镜像后,可以通过 docker container ls 看到最初的状态为 (health: starting)
    
    $ docker container ls
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS               NAMES
    03e28eb00bd0        myweb:v1            "nginx -g 'daemon off"   3 seconds ago       Up 2 seconds (health: starting)   80/tcp, 443/tcp     web
    
    在等待几秒钟后,再次 docker container ls,就会看到健康状态变化为了 (healthy)
    

    ARG

    ARG
      ARG指令使用--build-arg <varname> = <value>标志定义一个变量,用户可以使用docker build命令在构建时将该变量传递给构建器。
       如果用户指定了未在Dockerfile中定义的构建方案,则构建会输出警告
    语法:ARG <name> = <默认值> 1
       Dockerfile可以包括一个或多个ARG指令
       ARG指令可以可选地包括默认值
         ARG版本1.12
         ARG用户= mageedu
    
    
  • 相关阅读:
    fastapi教程进阶
    fastapi快速入门
    Linux yum安装PostgreSQL9.6
    harbor helm仓库使用
    Dockfile文件解析
    K8S概念理解
    转载---Beats:如何使用Filebeat将MySQL日志发送到Elasticsearch
    Elasticsearch中text与keyword的区别
    filebeat知识点
    logstash知识点
  • 原文地址:https://www.cnblogs.com/hao-ran/p/11529619.html
Copyright © 2011-2022 走看看