zoukankan      html  css  js  c++  java
  • DOCKER学习_012:Dockerfile配置指令详解

    1 Dockerfile结构

    基础镜像信息

    镜像操作指令

    容器启动时执行指令

    2 FROM

    指定基础镜像,用于继承其他镜像使用的

    FROM ubuntu:14.06
    FROM centos
    FROM nginx:latest

    3 LABEL

    镜像创建者的基本信息

    4 ENV

    定义Docker容器内的环境变量,使用ENV声明变量

    • ENV # 只能设置一个变量
    • ENV = … # 允许一次设置多个变量
    ENV <key> <value>
    指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持
    示例:
    ENV TZ "Asia/Shanghai"

    例如,在Dockerfile容器声明一个变量

    FROM centos:7
    LABEL  darren darren@gmail.com
    
    ENV TZ "Asia/Shanghai"
    
    RUN yum -y install openssh-server 
      && useradd natash 
      && echo "redhat"|passwd --stdin natash 
      && echo "redhat"|passwd --stdin root   
      && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
      && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' 
      && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 
      && echo "$TZ"
    
    ADD ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
    ADD ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
    ADD ssh_host_rsa_key     /tmp/ssh_host_rsa_key
    
    #CMD  ["/usr/sbin/sshd", "-D"]

    5 ADD

    将复制指定的 到容器中

    ADD <src> <dest>
    复制指定的<src>到容器中的<dest>
    <src>可以是dockerfile所在目录的一个相对路径,也可以是一个url,或者tar文件(会自动解压缩)
    示例:
    ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo

    源不能是绝对路径,必须是相对于Dockerfile的相对路径,例如如下操作

    [root@docker-server3 openssh]# mkdir  keys

    [root@docker-server3 openssh]# mv ssh_host_* keys/

    [root@docker-server3 openssh]# vi Dockerfile

    FROM centos:7
    LABEL  darren darren@gmail.com
    
    ENV TZ "Asia/Shanghai"
    
    RUN yum -y install openssh-server 
      && useradd natash 
      && echo "redhat"|passwd --stdin natash 
      && echo "redhat"|passwd --stdin root   
      && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
      && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' 
      && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 
      && echo "$TZ"
    
    ADD keys/ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
    ADD keys/ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
    ADD keys/ssh_host_rsa_key     /tmp/ssh_host_rsa_key
    
    #CMD  ["/usr/sbin/sshd", "-D"]

    6 COPY

    将复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的

    COPY <src> <dest>
    与ADD类似
    目录路径不存在时,会自动创建
    示例:
    COPY aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo

    ADD和COPY的区别

    在上面的那个ADD情况下,ADD和COPY没有任何区别

    ADD与COPY是完全不同的命令。COPY是这两个中最简单的,它只是从主机复制一份文件或者目录到镜像里。ADD同样可以这么做,但是它还有更神奇的功能,像解压TAR文件或从远程URLs获取文件。为了降低Dockerfile的复杂度以及防止意外的操作,最好用COPY来复制文件。Best Practices for Writing Dockerfiles建议尽量使用COPY,并使用RUN与COPY的组合来代替ADD,这是因为虽然COPY只支持本地文件拷贝到container,但它的处理比ADD更加透明,建议只在复制tar文件时使用ADD,如ADD trusty-core-amd64.tar.gz /。

    例如使用这种方式进行拷贝

    [root@docker-server3 openssh]# tar zcf keys.tar.gz  keys

    [root@docker-server3 openssh]# vi  Dockerfile 

    FROM centos:7
    LABEL  darren darren@gmail.com
    
    ENV TZ "Asia/Shanghai"
    
    RUN yum -y install openssh-server 
      && useradd natash 
      && echo "redhat"|passwd --stdin natash 
      && echo "redhat"|passwd --stdin root   
      && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
      && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' 
      && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 
      && echo "$TZ"
    
    #ADD keys/ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
    #ADD keys/ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
    #COPY keys/ssh_host_rsa_key     /tmp/ssh_host_rsa_key
    
    COPY keys.tar.gz   /keys.tar.gz
    RUN  tar -zxf  /keys.tar.gz  &&  cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/
    
    CMD  ["/usr/sbin/sshd", "-D"]

    [root@docker-server3 openssh]# docker build -t openssh:v1.5  .

    Sending build context to Docker daemon  10.24kB
    Step 1/7 : FROM centos:7
     ---> 5e35e350aded
    Step 2/7 : LABEL  darren darren@gmail.com
     ---> Using cache
     ---> eb19f72c1afd
    Step 3/7 : ENV TZ "Asia/Shanghai"
     ---> Running in d8f0df141bae
    Removing intermediate container d8f0df141bae
     ---> ef9b5d7d9bb0
    Step 4/7 : RUN yum -y install openssh-server   && useradd natash   && echo "redhat"|passwd --stdin natash   && echo "redhat"|passwd --stdin root     && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''  && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''   && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''   && echo "$TZ"
     ---> Running in 2aef49fc1769
    Loaded plugins: fastestmirror, ovl
    Determining fastest mirrors
     * base: mirror.pregi.net
     * extras: hk.mirrors.thegigabit.com
     * updates: hk.mirrors.thegigabit.com
    
    http://centos.uhost.hk/7.7.1908/os/x86_64/repodata/04efe80d41ea3d94d36294f7107709d1c8f70db11e152d6ef562da344748581a-primary.sqlite.bz2: [Errno 12] Timeout on http://centos.uhost.hk/7.7.1908/os/x86_64/repodata/04efe80d41ea3d94d36294f7107709d1c8f70db11e152d6ef562da344748581a-primary.sqlite.bz2: (28, 'Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds')
    Trying other mirror.
    Resolving Dependencies
    --> Running transaction check
    ---> Package openssh-server.x86_64 0:7.4p1-21.el7 will be installed
    --> Processing Dependency: openssh = 7.4p1-21.el7 for package: openssh-server-7.4p1-21.el7.x86_64
    --> Processing Dependency: fipscheck-lib(x86-64) >= 1.3.0 for package: openssh-server-7.4p1-21.el7.x86_64
    --> Processing Dependency: libwrap.so.0()(64bit) for package: openssh-server-7.4p1-21.el7.x86_64
    --> Processing Dependency: libfipscheck.so.1()(64bit) for package: openssh-server-7.4p1-21.el7.x86_64
    --> Running transaction check
    ---> Package fipscheck-lib.x86_64 0:1.4.1-6.el7 will be installed
    --> Processing Dependency: /usr/bin/fipscheck for package: fipscheck-lib-1.4.1-6.el7.x86_64
    ---> Package openssh.x86_64 0:7.4p1-21.el7 will be installed
    ---> Package tcp_wrappers-libs.x86_64 0:7.6-77.el7 will be installed
    --> Running transaction check
    ---> Package fipscheck.x86_64 0:1.4.1-6.el7 will be installed
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ================================================================================
     Package                  Arch          Version               Repository   Size
    ================================================================================
    Installing:
     openssh-server           x86_64        7.4p1-21.el7          base        459 k
    Installing for dependencies:
     fipscheck                x86_64        1.4.1-6.el7           base         21 k
     fipscheck-lib            x86_64        1.4.1-6.el7           base         11 k
     openssh                  x86_64        7.4p1-21.el7          base        510 k
     tcp_wrappers-libs        x86_64        7.6-77.el7            base         66 k
    
    Transaction Summary
    ================================================================================
    Install  1 Package (+4 Dependent packages)
    
    Total download size: 1.0 M
    Installed size: 3.0 M
    Downloading packages:
    warning: /var/cache/yum/x86_64/7/base/packages/fipscheck-1.4.1-6.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
    Public key for fipscheck-1.4.1-6.el7.x86_64.rpm is not installed
    --------------------------------------------------------------------------------
    Total                                              391 kB/s | 1.0 MB  00:02     
    Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    Importing GPG key 0xF4A80EB5:
     Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
     Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
     Package    : centos-release-7-7.1908.0.el7.centos.x86_64 (@CentOS)
     From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
      Installing : fipscheck-1.4.1-6.el7.x86_64                                 1/5 
      Installing : fipscheck-lib-1.4.1-6.el7.x86_64                             2/5 
      Installing : openssh-7.4p1-21.el7.x86_64                                  3/5 
      Installing : tcp_wrappers-libs-7.6-77.el7.x86_64                          4/5 
      Installing : openssh-server-7.4p1-21.el7.x86_64                           5/5 
      Verifying  : fipscheck-lib-1.4.1-6.el7.x86_64                             1/5 
      Verifying  : tcp_wrappers-libs-7.6-77.el7.x86_64                          2/5 
      Verifying  : fipscheck-1.4.1-6.el7.x86_64                                 3/5 
      Verifying  : openssh-7.4p1-21.el7.x86_64                                  4/5 
      Verifying  : openssh-server-7.4p1-21.el7.x86_64                           5/5 
    
    Installed:
      openssh-server.x86_64 0:7.4p1-21.el7                                          
    
    Dependency Installed:
      fipscheck.x86_64 0:1.4.1-6.el7      fipscheck-lib.x86_64 0:1.4.1-6.el7        
      openssh.x86_64 0:7.4p1-21.el7       tcp_wrappers-libs.x86_64 0:7.6-77.el7     
    
    Complete!
    Changing password for user natash.
    passwd: all authentication tokens updated successfully.
    Changing password for user root.
    passwd: all authentication tokens updated successfully.
    Generating public/private dsa key pair.
    Your identification has been saved in /etc/ssh/ssh_host_ed25519_key.
    Your public key has been saved in /etc/ssh/ssh_host_ed25519_key.pub.
    The key fingerprint is:
    SHA256:e5C8TNeWaFze+kluznGRnyGTuUPVGRMtSM7J1w7VBA0 root@2aef49fc1769
    The key's randomart image is:
    +---[DSA 1024]----+
    |           ...EO*|
    |           +...oO|
    |            * o+o|
    |       . o = ++o.|
    |        S = =*.+.|
    |       o * ...+ =|
    |        + . .oo.o|
    |         .   =o+ |
    |             o*  |
    +----[SHA256]-----+
    Asia/Shanghai                                          #这里就是打印的ENV声明的变量
    Removing intermediate container 2aef49fc1769
     ---> e11453e3dd3b
    Step 5/7 : COPY keys.tar.gz   /keys.tar.gz             #COPY的操作
     ---> bddfb2743c4d
    Step 6/7 : RUN  tar -zxf  /keys.tar.gz  &&  cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/
     ---> Running in eddbbc44e2a6
    Removing intermediate container eddbbc44e2a6
     ---> 79e6df645d78
    Step 7/7 : CMD  ["/usr/sbin/sshd", "-D"]
     ---> Running in 217fbee101d4
    Removing intermediate container 217fbee101d4
     ---> 90743d882696
    Successfully built 90743d882696
    Successfully tagged openssh:v1.5

    [root@docker-server3 openssh]# docker run -d openssh:v1.5

    41e2d69f3503d0cd459d1f7cd56ae9f51aaf7749bef7f79f089e551bc4de4ecb

    [root@docker-server3 openssh]# docker ps -a

    CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS                      PORTS               NAMES
    41e2d69f3503        openssh:v1.5        "/usr/sbin/sshd -D"   9 seconds ago       Up 8 seconds                                    objective_sinoussi
    db351e66fc63        openssh:v1.4        "/usr/sbin/sshd -D"   34 minutes ago      Up 34 minutes                                   nifty_curran
    f6a4ebe048cd        openssh:v1.4        "/bin/bash"           35 minutes ago      Exited (0) 35 minutes ago                       adoring_archimedes
    fd2c629a2b3c        openssh:v1.3        "/usr/sbin/sshd -D"   42 hours ago        Up 42 hours

    上面这种是COPY,使用ADD操作

    FROM centos:7
    LABEL  darren darren@gmail.com
    
    ENV TZ "Asia/Shanghai"
    
    RUN yum -y install openssh-server 
      && useradd natash 
      && echo "redhat"|passwd --stdin natash 
      && echo "redhat"|passwd --stdin root   
      && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
      && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' 
      && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 
      && echo "$TZ"
    
    #ADD keys/ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
    #ADD keys/ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
    #COPY keys/ssh_host_rsa_key     /tmp/ssh_host_rsa_key
    
    #COPY keys.tar.gz   /keys.tar.gz
    #RUN  tar -zxf  /keys.tar.gz  &&  cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/
    ADD keys.tar.gz   /
    RUN cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/            #少一个解压操作
    
    CMD  ["/usr/sbin/sshd", "-D"]

    ADD会把压缩文件自动解压,而且会删除压缩包

    7 WORKDIR

    进入容器的默认路径,相当于cd,后续的RUN、CMD、ENTRYPOINT也会使用指定路径。

    WORKDIR </path/to/workdir>
    为后续的RUN、CMDENTRYPOINT指令配置工作目录
    可以使用多个WORKDIR,后续命令如果参数是相对路径,则会基于之前命令指定的路径
    示例:
    WORKDIR /a
    WORKDIR b
    WORKDIR c

    例如在面的操作中,我们会把文件copy到/tmp下,我们可以这么设置

    FROM centos:7
    LABEL  darren darren@gmail.com
    
    ENV TZ "Asia/Shanghai"
    
    RUN yum -y install openssh-server 
      && useradd natash 
      && echo "redhat"|passwd --stdin natash 
      && echo "redhat"|passwd --stdin root   
      && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
      && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' 
      && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 
      && echo "$TZ"
    
    #ADD keys/ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
    #ADD keys/ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
    #COPY keys/ssh_host_rsa_key     /tmp/ssh_host_rsa_key
    
    #COPY keys.tar.gz   /keys.tar.gz
    #RUN  tar -zxf  /keys.tar.gz  &&  cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/
    ADD keys.tar.gz   /
    WORKDIR   /tmp
    RUN cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  ./
    
    CMD  ["/usr/sbin/sshd", "-D"]

    8 USER

    指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户

    当服务不需要管理员权限时,可以通过该命令指定运行用户,如果不指定就默认是root用户

    USER <username>
    示例:
    USRE www

    例指定用户为natash,那么在这个指定用户后的所有操作都将是natash

    FROM centos:7
    LABEL  darren darren@gmail.com
    
    ENV TZ "Asia/Shanghai"
    
    RUN yum -y install openssh-server 
      && useradd natash 
      && echo "redhat"|passwd --stdin natash 
      && echo "redhat"|passwd --stdin root   
      && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
      && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' 
      && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 
      && echo "$TZ"
    
    #ADD keys/ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
    #ADD keys/ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
    #COPY keys/ssh_host_rsa_key     /tmp/ssh_host_rsa_key
    
    #COPY keys.tar.gz   /keys.tar.gz
    #RUN  tar -zxf  /keys.tar.gz  &&  cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/
    ADD keys.tar.gz   /
    WORKDIR   /tmp
    USER   natash
    RUN cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  ./
    
    CMD  ["/usr/sbin/sshd", "-D"]

    同时USER和WORKDIR可以出现多次,就是切换用户和目录的过程

    9 RUN

    RUN用来执行命令行命令的,只是在构建镜像build的时候执行

    RUN <command> 或者 RUN ["executable","param1","param2"]
    前者将在shell命令终端中执行,即/bin/sh -c ;后者使用exec执行
    每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像
    当命令较长时,可使用/换行
    示例:
    RUN ["/bin/bash","-c","echo hello"]
    RUN apt install -y openssh-server

    RUN在执行的时候,会多镜像层,所以尽可能在完成功能的前提下,少执行RUN,ADD,COPY等操作

    比如我们对上个Dockerfile做一个优化

    FROM centos:7
    LABEL  darren darren@gmail.com
    
    ENV TZ "Asia/Shanghai"
    
    ADD keys.tar.gz   /
    RUN yum -y install openssh-server 
      && useradd natash 
      && echo "redhat"|passwd --stdin natash 
      && echo "redhat"|passwd --stdin root   
      && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
      && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' 
      && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 
      && echo "$TZ"
      && cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/
    #ADD keys/ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
    #ADD keys/ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
    #COPY keys/ssh_host_rsa_key     /tmp/ssh_host_rsa_key
    
    #COPY keys.tar.gz   /keys.tar.gz
    #RUN  tar -zxf  /keys.tar.gz  &&  cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/
    #RUN cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  ./
    
    CMD  ["/usr/sbin/sshd", "-D"]

    这样就少一个RUN指令,少一个镜像层,镜像层越多,性能越差

    10 VOLUME

    创建一个挂载点,类似于容器启动时使用的-v选项,只不过这里不能指定挂载到宿主机的位置

    默认为/var/lib/docker/${文件系统名称}目录下

    一般用来存放数据库和需要保持的数据

    VOLUME <path>
    示例:
    VOLUME ["data"]

    11 EXPOSE

    告诉docker容器需要暴露的端口,对外声明端口使用的

    在启动容器时需要通过-P,docker主机会自动分配一个端口转发到指定的端口

    使用-p,则可以具体指定哪个本地端口映射过来

    EXPOSE <port> [<port>...]
    示例:
    EXPOSE 22 80

    例如,运行一个nginx容器

    [root@docker-server3 openssh]# docker run -d nginx

    [root@docker-server3 openssh]# docker ps -a

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
    e0847916fa35        nginx               "nginx -g 'daemon of…"   14 seconds ago      Up 13 seconds            80/tcp              pedantic_blackburn    #80端口
    41e2d69f3503        openssh:v1.5        "/usr/sbin/sshd -D"      7 hours ago         Up 7 hours                                   objective_sinoussi
    db351e66fc63        openssh:v1.4        "/usr/sbin/sshd -D"      7 hours ago         Up 7 hours                                   nifty_curran
    f6a4ebe048cd        openssh:v1.4        "/bin/bash"              7 hours ago         Exited (0) 7 hours ago                       adoring_archimedes
    fd2c629a2b3c        openssh:v1.3        "/usr/sbin/sshd -D"      2 days ago          Up 2 days 

    意味着nginx会监听在80端口上

    EXPOSE会声明监听在那个端口上,没有声明,他的端口也是打开的

    FROM centos:7
    LABEL  darren darren@gmail.com
    
    ENV TZ "Asia/Shanghai"
    
    ADD keys.tar.gz   /
    RUN yum -y install openssh-server 
      && useradd natash 
      && echo "redhat"|passwd --stdin natash 
      && echo "redhat"|passwd --stdin root   
      && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
      && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' 
      && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 
      && echo "$TZ"
      && cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/
    #ADD keys/ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
    #ADD keys/ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
    #COPY keys/ssh_host_rsa_key     /tmp/ssh_host_rsa_key
    
    #COPY keys.tar.gz   /keys.tar.gz
    #RUN  tar -zxf  /keys.tar.gz  &&  cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/
    #RUN cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  ./
    
    EXPOSE  22  80 
    CMD  ["/usr/sbin/sshd", "-D"]

    这个端口,只是声明

    [root@docker-server3 openssh]# docker build -t openssh:v1.6 .

    [root@docker-server3 openssh]# docker run -d openssh:v1.6

    [root@docker-server3 openssh]# docker ps -a

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
    131649a5d893        openssh:v1.6        "/usr/sbin/sshd -D"      5 seconds ago       Up 4 seconds             22/tcp, 80/tcp      zealous_poincare
    e0847916fa35        nginx               "nginx -g 'daemon of…"   8 minutes ago       Up 8 minutes             80/tcp              pedantic_blackburn
    41e2d69f3503        openssh:v1.5        "/usr/sbin/sshd -D"      7 hours ago         Up 7 hours                                   objective_sinoussi
    db351e66fc63        openssh:v1.4        "/usr/sbin/sshd -D"      7 hours ago         Up 7 hours                                   nifty_curran
    f6a4ebe048cd        openssh:v1.4        "/bin/bash"              7 hours ago         Exited (0) 7 hours ago                       adoring_archimedes
    fd2c629a2b3c        openssh:v1.3        "/usr/sbin/sshd -D"      2 days ago          Up 2 days

    可以看到声明的两个端口22和80

    查看docker的日志,docker logs  +dockerid

    12 HEALTHCHECK

    用于检测容器指定的进程是否存活

    避免进程僵死导致容器未异常退出引起的故障

    HEALTHCHECK [args] CMD <指令>
    
    示例:
    FROM nginx
    RUN apt-get update && apt-get install -y curl && rm -rf /var/lib
    /apt/lists/*
    HEALTHCHECK --interval=5s --retries=3 --timeout=3s 
    CMD curl -fs http://localhost/ || exit 1

    13 CMD

    指定启动容器时执行的命令,默认执行的任务

    每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行

    如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令

    语法:
    CMD ["executable","param1","param2"] #使用exec执行,推荐的方式
    CMD command param1 param2 #在/bin/sh中执行,提供给需要交互的应用
    CMD ["param1","param2"] #提供给ENTRYPOINT的默认参数
    示例:
    CMD ["supervisord","-c","/etc/supervisord.conf"]

    如果不加,就没有默认指令,但是启动容器的时候也会指定一个指令

    例如注释掉上个镜像的CMD指令,启动一个容器

    [root@docker-server3 openssh]# vi Dockerfile

    FROM centos:7
    LABEL  darren darren@gmail.com
    
    RUN yum -y install openssh-server 
      && useradd natash 
      && echo "redhat"|passwd --stdin natash 
      && echo "redhat"|passwd --stdin root   
      && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
      && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' 
      && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''
    
    ADD ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
    ADD ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
    ADD ssh_host_rsa_key     /tmp/ssh_host_rsa_key
    
    #CMD  ["/usr/sbin/sshd", "-D"]

    [root@docker-server3 openssh]# docker build -t openssh:v1.4 .

    Sending build context to Docker daemon  7.168kB
    Step 1/6 : FROM centos:7
     ---> 5e35e350aded
    Step 2/6 : LABEL  darren darren@gmail.com
     ---> Using cache
     ---> eb19f72c1afd
    Step 3/6 : RUN yum -y install openssh-server   && useradd natash   && echo "redhat"|passwd --stdin natash   && echo "redhat"|passwd --stdin root     && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''  && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''   && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''
     ---> Using cache
     ---> 2be613021085
    Step 4/6 : ADD ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
     ---> Using cache
     ---> c64f7dcda4c1
    Step 5/6 : ADD ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
     ---> Using cache
     ---> 86e57a7a4313
    Step 6/6 : ADD ssh_host_rsa_key     /tmp/ssh_host_rsa_key
     ---> Using cache
     ---> 2412a6e26b9c
    Successfully built 2412a6e26b9c
    Successfully tagged openssh:v1.4

    [root@docker-server3 openssh]# docker run -d openssh:v1.4

    f6a4ebe048cd04d4b7407f3f452d22d8ecfdee3b87f36a3c84524eacf467bf4d

    [root@docker-server3 openssh]# docker ps -a

    CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS                     PORTS               NAMES
    f6a4ebe048cd        openssh:v1.4        "/bin/bash"           4 seconds ago       Exited (0) 3 seconds ago                       adoring_archimedes    #默认执行/bin/bash,并退出
    fd2c629a2b3c        openssh:v1.3        "/usr/sbin/sshd -D"   41 hours ago        Up 41 hours  

    /bin/bash指令来源于基础镜像centos:7

    在命令行指定一个默认指令,启动容器效果一样

    [root@docker-server3 openssh]# docker run -d openssh:v1.4 /usr/sbin/sshd -D

    db351e66fc63fc4aa5f84c48a14d7ee4ced18c3a079deeae6332dfb4c8b1933

    [root@docker-server3 openssh]# docker ps -a

    CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS                      PORTS               NAMES
    db351e66fc63        openssh:v1.4        "/usr/sbin/sshd -D"   4 seconds ago       Up 3 seconds                                    nifty_curran
    f6a4ebe048cd        openssh:v1.4        "/bin/bash"           31 seconds ago      Exited (0) 29 seconds ago                       adoring_archimedes
    fd2c629a2b3c        openssh:v1.3        "/usr/sbin/sshd -D"   41 hours ago        Up 41 hours  

    使用另一种方式写CMD

    FROM centos:7
    LABEL  darren darren@gmail.com
    
    ENV TZ "Asia/Shanghai"
    
    ADD keys.tar.gz   /
    RUN yum -y install openssh-server 
      && useradd natash 
      && echo "redhat"|passwd --stdin natash 
      && echo "redhat"|passwd --stdin root   
      && ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
      && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' 
      && ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 
      && echo "$TZ"
      && cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/
    #ADD keys/ssh_host_ecdsa_key   /tmp/ssh_host_ecdsa_key
    #ADD keys/ssh_host_ed25519_key /tmp/ssh_host_ed25519_key
    #COPY keys/ssh_host_rsa_key     /tmp/ssh_host_rsa_key
    
    #COPY keys.tar.gz   /keys.tar.gz
    #RUN  tar -zxf  /keys.tar.gz  &&  cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  /tmp/
    #RUN cp /keys/ssh_host_ecdsa_key  /keys/ssh_host_ed25519_key  /keys/ssh_host_rsa_key  ./
    
    EXPOSE  22  80
    #CMD  ["/usr/sbin/sshd", "-D"]
    CMD  /usr/sbin/sshd -D

    [root@docker-server3 openssh]# docker build -t openssh:v1.7 .

    [root@docker-server3 openssh]# docker run -d openssh:v1.7

    [root@docker-server3 openssh]# docker ps -a

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
    915f9a1854c6        openssh:v1.7        "/bin/sh -c '/usr/sb…"   6 seconds ago       Up 5 seconds             22/tcp, 80/tcp      practical_margulis
    131649a5d893        openssh:v1.6        "/usr/sbin/sshd -D"      7 minutes ago       Up 7 minutes             22/tcp, 80/tcp      zealous_poincare
    e0847916fa35        nginx               "nginx -g 'daemon of…"   15 minutes ago      Up 15 minutes            80/tcp              pedantic_blackburn
    41e2d69f3503        openssh:v1.5        "/usr/sbin/sshd -D"      7 hours ago         Up 7 hours                                   objective_sinoussi
    db351e66fc63        openssh:v1.4        "/usr/sbin/sshd -D"      8 hours ago         Up 8 hours                                   nifty_curran
    f6a4ebe048cd        openssh:v1.4        "/bin/bash"              8 hours ago         Exited (0) 8 hours ago                       adoring_archimedes
    fd2c629a2b3c        openssh:v1.3        "/usr/sbin/sshd -D"      2 days ago          Up 2 days

    也会运行,但是会自动运行一个/bin/sh -c  来执行我们的默认指令

    第三种,只用CMD传递参数,但是必须配和ENTRYPOINT使用

    14 ENTRYPOINT

    配置容器启动后执行的命令

    不会被docker run 提供的参数覆盖

    每个Dockerfile只能有一个ENTRYPOINT,如果指定了多个,只有最后一个被执行

    语法:
    ENTRYPOINT ["executable","param1","param2"]
    ENTRYPOINT command param1 param2
    
    示例:
    ENTRYPOINT ["/build.sh"]

    15 ONBUILD

    配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令

    语法:
    ONBUILD [INSTRUTION]
    
    示例:
    创建镜像A:
    ONBUILD ADD . /app/src
    ONBUILD RUN /usr/local/bin/pypthon-build --dir /app/src
    如果基于镜像A创建新的镜像时,新的Dockerfile使用FROM A指定基础镜像时,会自动执行ONBUILD指令内容,等价于在后面添加了两条指令:
    FROM A
    ADD . /app/src
    RUN /usr/local/bin/python-build --dir /app/src
    使用ONBUILD指令的镜像,推荐在标签中注明,如:ruby:1.9-onbuild

    16 编写Dockerfile的原则,最佳实践

    尽可能让变更少的镜像层优先构建

    二次构建时,利用镜像的缓存特性提升构建效率

    尽可能少的使用生成镜像层的指令关键字

    每使用一次指令关键字,就会创建一个新的只读层

    尽可能清理不必要的文件

    使构建后的镜像尽可能的小


    博主声明:本文的内容来源主要来自誉天教育晏威老师,由本人实验完成操作验证,需要的博友请联系誉天教育(http://www.yutianedu.com/),获得官方同意或者晏老师(https://www.cnblogs.com/breezey/)本人同意即可转载,谢谢!

  • 相关阅读:
    js最佳实践
    js图片库 案例
    DOM
    js语法
    导航栏的ul中的li设置问题
    wDatepicker97的用法(点击事件联动)
    jqueyr validtion的使用
    哥哥写的例子(后台没有进行排序分组的时候,前台进行自己分组)
    关于require js加载的时候报错的问题
    一些简单的三目运算的使用(举例购物车)
  • 原文地址:https://www.cnblogs.com/zyxnhr/p/12147137.html
Copyright © 2011-2022 走看看