• dockerfile文件参数


    一、背景

    如果仅限于使用dockerhub里面的镜像,是没办法满足我们实际的应用场景的,所以我们需要创建属于自己的docker镜像

    构建docker镜像需要编写dockerfile,却不知道语法怎么写。

    下文为简介dockerfile参数,以及相应的作用。


    二、dockerfile参数说明

    • FROM
      指定基础镜像

    • MAINTAINER
      维护者名称,自定义,可写可不写

    • RUN
      镜像构建时运行的命令,可以写shell命令也可以写成exec样式
    【shell样式】
    RUN mkdir -p /test/a
    
    【exec样式】
    RUN [“mkdir”,“-p”,“/test/a”]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    • EXPOSE
      用于指定容器默认映射的端口,端口可以写多个
      在docker run -P(大P)时,会自动随机物理机的端口映射 EXPOSE 的端口。
      可以使用docker run -p命令指定其他端口。
    【多个端口】
    EXPOSE [port1,port2]
    EXPOSE [80,8080]
    
    • 1
    • 2
    • 3

    • CMD
      通常用于启动服务,会在docker run时运行
      只执行一次,如果有多个CMD默认只会执行最后一个。

    • ENTRYPOINT
      类似CMD,通常用于启动服务。指定容器启动后执行的命令,也是多个执行最后一个。
      不可被docker run提供的参数覆盖。
      可以传参运行,docker run 时可以用-c指定变参
    【例如】
    ENTRYPOINT ["nginx", "-c"] # 定参
    CMD ["/etc/nginx/nginx.conf"] # 变参 
    
    • 1
    • 2
    • 3

    指定了ENRTYPOINT,在docker run的时候就不要加/bin/bash,不然会运行出错


    • COPY
      用于复制。本地源地址 > 容器内地址
      可以指定属主: chown=user:group
      可以是通配符,其通配符规则要满足 Go 的 filepath.Match 规则
    【例如】
    COPY hom* /mydir/
    COPY hom?.txt /mydir/
    
    • 1
    • 2
    • 3

    • ADD

    和COPY一样是复制,但是复制压缩文件时,会自动解压缩。
    tar、gzip、bzip2、xz格式复制会自动解压到目标路径
    没办法用于复制整个tar文件,要用copy

    【用法】
    ADD nginx.tar /etc/nginx/
    
    • 1
    • 2

    • VOLUME
      数据卷
      定义匿名数据卷,一般是启动时忘记挂载数据卷,并且会自动挂载到定义的匿名数据卷。
      在容器创建过程中会在容器中创建该目录,在宿主机上的挂载目录名是随机生成的,在这个目录下/var/lib/docker/volumes/
    【用法】
    volume ["/data"]
    
    docker run -v 主机目录:容器目录:权限 -itd 镜像名
    
    例如:
    docker run --name nginx -v /data:/nginx:ro -itd nginx_images
    
    修改挂载点,使用-v会安全点
    权限可以为ro只读、rw读写
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    • WORKDIR
      用于指定工作目录,如果镜像中对应的路径不存在,会自动创建此目录
      WORKDIR 中需要指定绝对路径
    【用法】
    WORKDIR /workdir
    
    • 1
    • 2

    • ENV
      设置镜像内的环境变量
    【例如】
    # 设置nginx =/usr/share/nginx/html/, 在后续的指令中可以通过$nginx引用:
    
    ENV nginx /usr/share/nginx/html/
    
    COPY index.html $nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    • USER
      用于指定执行后续命令的用户和用户组
      用户和用户组必须提前已经存在
    【用法】
    USER user_name/uid
    USER user:group 
    USER uid:gid
    
    • 1
    • 2
    • 3
    • 4

    • ONBUILD
      配置当前所创建的镜像,后续被作为其它新创建镜像的基础镜像时,执行的命令。
      创建的镜像A配置了这个命令,后续镜像A被作为基础镜像,创建镜像B时会执行。
    【例如】
    # 后续创建的目录会自动重新上传dockerfile目录里的index.html文件
    ONBUILD COPY index.html /usr/share/nginx/html/
    
    • 1
    • 2
    • 3

    • LABEL
      用来给镜像添加一些元数据(metadata),可以指定多个
      可以使用docker inspect命令查看label
    【例如】
    LABEL image.version="1.0" 
    
    【多个LABLE方法1,用“\”换行写】
    LABEL image.version="1.0" \
    	  image.creator="wbh"
    
    【多个LABLE方法2】
    LABEL image.version="1.0" image.creator="wbh"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    • HEALTHCHECK
      用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
    【语法】
    HEALTHCHECK [<options>] CMD <cmd>
    
    --interval=<间隔>:两次健康检查的间隔,默认为 30 秒。
    --timeout=<间隔>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒。
    --retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
    --start-period=<间隔>: 应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认 0 秒(从 V17.05 引入)。
    在 HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 和 exec 格式。命令的返回值决定了该次健康检查的成功与否:
    
    0:成功
    1:失败
    2:保留值,不要使用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    • ARG
      用于构建参数,和ENV的作用差不多。但是ARG设置的是局部变量,只在dockerfile里面生效.
      在docker build的时候生效,构建镜像后此局部变量会不存在。

    在docker build 时可以使用 --build-arg 定义变量的值。
    不建议在构建时使用ARG传递密钥、用户凭证等信息,因为构建时的信息任何用户都可以通过docker history看到


    三、nginx例子

    nginx的dockerfile模板。

    需要有个基础的镜像,基于这个镜像创建自定义的镜像,可以使用官方的centos镜像
    docker pull centos
    
    • 1
    • 2

    注意:构建镜像的文件名必须为dockerfile,目录可以自定义


    3.1 需要先创建个dockerfile目录

    mkdir /nginx/
    
    • 1

    3.2 在dockerfile目录下创建dockerfile文件

    vim /nginx/dockerfile
    
    FROM centos
    MAINTAINER daoxiang
    RUN yum install wget -y
    RUN yum install nginx -y
    COPY index.html /usr/share/nginx/html/
    EXPOSE 80
    ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
    
    
    #创建index.html文件
    vim /nginx/index.html
    hello,world!!!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3.3 构建镜像的命令

    docker build -t “images_name:tag” dockerfile_path
    -t 用于命名镜像名和版本
    -f 指定dockerfile目录的绝对路径
    
    
    #制作镜像
    docker build -t “wbh/nginx:v1” /nginx/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.4 创建容器

    #基于自己的镜像创建容器
    docker run -itd -p 80 --name=nginx wbh/nginx:v1 
    
    
    • 1
    • 2
    • 3

    3.5 测试nginx是否正常运行

    #查看容器地址
    docker inspect nginx
    
    # curl 容器ip
    curl 172.17.0.2 
    
    # 显示出hello,world! 就成功了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    C++ 类的非静态数据成员默认初始化
    JAVA 包装类
    JavaScript数组的扁平化:将 2D JavaScript 二维数组转换为 1D 一维数组(多种方法)
    安卓面经_anroid面经_111道安卓基础面试题全解析
    Linux系统编程(一):文件 I/O
    小程序的多种特性
    智工教育:教编考试加分事项及报考条件
    nginx配置netty
    聚乙二醇/聚吡咯/多聚赖氨酸(PLL)/聚合物-聚乙烯亚胺(PEI)包裹四氧化三铁磁性纳米颗粒
    C++ 模板进阶
  • 原文地址:https://blog.csdn.net/qq_31649693/article/details/127792550