zoukankan      html  css  js  c++  java
  • docker——Dockerfile(一)

    Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。
    Dockerfile由一行行命令语句组成,并支持以#开头的注释行。
    一般而言,Dockerfile分为四部分:基础镜像信息维护者信息镜像操作指令容器启动时执行的命令

    一、Dockerfile指令说明:

    下面是指令详情:

    1.FROM

    说明:指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像。
    格式:
      FROM <image>
      FROM <image>:<tag>
      FROM <image>@<digest>

    任何Dockerfile中的第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创造多个镜像,可以使用多个FROM指令,每个镜像一个。

    2.MAINTAINER

    说明:指定维护者信息
    格式:
      MAINTAINER <name>

    该信息会写入生成镜像的Author属性域中。

    3.RUN

    说明:运行指定命令
    格式:
      RUN <command>
      RUN ["executable","param1","param2"] (RUN ["可执行文本","参数1","参数2"]) 指令会被解析为Json数组,因此必须用双引号。
    实例:
      RUN echo hello
      RUN ["/bin/bash","-c","echo hello"]

    RUN <command> 默认会在shell终端中运行命令,即/bin/sh -c
    RUN ["","",""] 使用exec执行,不会启动shell环境
    每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。
    当命令较长时,可以使用来换行。

    4.CMD

    说明:指定启动容器时默认执行的命令
    格式:
      CMD ["executable","param1","param2"] 使用exec执行,推荐使用的方式
      CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用
      CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数

    每个Dockerfile只能有一条CMD命令,如果指定了多条命令,只有最后一条会被执行
    如果用户启动容器时,手动指定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令。

    5.LABEL

    说明:用来指定生成镜像的元数据标签信息
    格式:
      LABEL <key>=<value> <key>=<value> <key>=<value>...
    实例:
      LABEL version="1.0"
      LABEL description="This is test_label"

    6.EXPOSE

    说明:声明镜像内服务所监听的端口
    格式:
      EXPOSE <port> [<port> <port> ...]
    实例:
      EXPORT 22 80 443

    注意,该指令只是起到声明作用,并不会自动完成端口映射。
    如果你要完成映射还是要在创建的时候使用-p/-P参数。

    7.ENV

    说明:指定环境变量,在镜像的生成过程中会被后续RUN指令调用,在启动的容器中也会存在。
    格式:
      ENV <key> <value>
      ENV <key>=<value>
    实例:
      ENV PG_MAJOR 9.8.3

    指令指定的环境变量在运行时可以被覆盖。

    8.ADD

    说明:复制指定的<src>路径下的内容到容器中的<dest>路径下
    格式:
      ADD <src> <dest>
    实例:
      ADD *.c /code/

    其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个URL,
    还可以是一个tar文件(如果是tar文件会自动解压到<dest>路径下)。
    <dest>可以是镜像内的绝对路径,或者相对于工作目录(WORKDIR)的相对路径。


    9.COPY

    说明:复制本地主机的<src>(Dockerfile所在目录的相对路径、文件或目录)下的内容到镜像中的<dest>下,目标路径不存在时,会自动创建。
    格式:
      COPY <src> <dest>

    当使用本地目录为源目录时,推荐使用COPY


    10.ENTRYPOINT

    说明:指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所以传入值作为该命令的参数
    格式:
      ENTRYPOINT ["executable","param1","param2"] exec调用执行
      ENTRYPOINT command param1 param2 shell中执行

    此时,CMD指令指定值将作为根命令的参数。
    每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效。
    在运行时,可以被 --entrypoint参数覆盖掉。

    11.VOLUME

    说明:创建一个数据卷挂载点。
    格式:
    VOLUME ["/data"]

    可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保存的数据等

    12.USER

    说明:指定运行容器时的用户名或UID,后续的RUN等指令也会使用指定的用户身份。
    格式:
      USER daemon

    当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在之前创建所需要的用户。
    RUN groupadd -r postgres && useradd -r -g postgress postgress
    要零时获取管理员权限可以使用gosu或sudo


    13.WORKDIR

    说明:为后续的RUN、CMD和ENTRYPOINT指定配置的工作目录。
    格式:
      WORKDIR /path/to/workdir

    可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
      WORKDIR /a
      WORKDIR b
      WORKDIR c
    则最终路径为/a/b/c

    14.ARG

    说明:指定一些镜像内使用的参数(例如版本号信息),这些参数在执行docker build命令时才以--build-arg<varname>=<value>格式传入。
    格式:
      ARG <name> [=<default value>]

    15.ONBUILD

    说明:配置当前所创建的镜像作为其它镜像的基础镜像时,所执行的创建操作指令。
    格式:
      ONBUILD [INSTRUCTION]

    例如,Dockerfile使用如下类容创建的镜像image-A

        [...]    
    ONBUILD ADD . /app/src
        [...]

    如果基于镜像image-A创建新的镜像,那么新的镜像就会自动执行上面的ONBUILD指定的内容,类似于继承的关系。

    16.STOPSIGNAL

    说明:指定所创建镜像启动的容器接收退出的信号值
    实例:
      STOPSIGNAL signal

    17.HEALTHCHECK

    说明:配置所启动容器如何进行健康检查(如何判断健康与否)
    格式:
      HEALTHCHECK [OPTIONS] CMD command 根据所执行命令返回值是否为0来判断
    OPTION支持的选项:
      --interval=DURATION(默认为:30s) 过多久检查一次
      --timeout=DURAION(默认为:30s) 每次检查等待结果的超时
      --retries=N(默认为:3) 如果失败了,重试几次才最终确定失败

    HEALTHCHECK NONE 禁止基础镜像中的健康检查

    18.SHELL

    说明:指定其它命令使用shell时的默认shell类型
    实例:
      SHELL ["executable","parameters"]

    默认值为 ["/bin/sh","-c"]



    二、创建镜像

    编写完Dockerfile之后,可以通过docker build来创建镜像。下面两种写法都是可行的

    docker build -t centos_nginx:v1 /docker_demo
    docker build -t centos_nginx:v1

    如果没有指定Dockerfile的路径,那么就会默认读取当前目录下(包括子目录)的Dockerfile。
    并将该路径下的所有内容发送给Docker服务端,由服务端来创建镜像。
    如果使用非内容路径下的Dockerfile,可以使用-f选项来指定其路径。
    要指定生成镜像的标签信息,可以使用-t选项。
    建议放置Dockerfile的目录为空目录。

    三、简单应用

    centos镜像+nginx.tar

    切换目录:

    cd /

    创建工作路径:

    mkdir docker_demo

    创建Dockerfile文件:

    touch Dockerfile

    编辑文件:

    # base image
    FROM docker.io/centos
    
    # MAINTAINER
    MAINTAINER 467661568@qq.com
    
    # put nginx-1.9.0.tar.gz into /usr/local/src and unpack nginx
    #将当前目录下的包复制到/usr/local/src目录下
    ADD nginx-1.9.0.tar.gz /usr/local/src
    
    # running required command
    #执行命令,安装依赖包
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
    RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
    RUN useradd -M -s /sbin/nologin nginx
    
    # change dir to /usr/local/src/nginx-1.9.0
    #指定工作路径
    WORKDIR /usr/local/src/nginx-1.9.0
    
    # execute command to compile nginx
    #安装软件包
    RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
    
    #声明被监控的端口
    EXPOSE 80

    创建镜像:

    docker run -d -P centos_nginx:v1 /usr/local/nginx/sbin/nginx -g "daemon off;"

    /usr/local/nginx/sbin/nginx:nginx的启动命令

    访问32774端口:

    注意:
    daemon on | off 默认on
    是否以守护进程的方式运行nginx。守护进程是指脱离终端在后面运行的进程。


    变化一:
    添加一个环境变量

    ENV PATH /usr/local/nginx/sbin:$PATH

    这样在创建容器的时候,就可以省去前面的路径

    docker run -d -P centos_nginx:v1 nginx -g "daemon off;"


    变化二:
    添加一个CMD(启动容器时默认执行的命令)

    CMD /bin/sh -c 'nginx -g "daemon off;"'    

    这样在创建容器的时候就不需要那么麻烦。

    docker run -d -P centos_nginx:v1

    变化三:
    添加一个ENTRYPOINT指令,默认的入口命令,CMD命令将作为其参数

    ENTRYPOINT ["nginx"]
    
    CMD ["-g","daemon off;"]
  • 相关阅读:
    POJ 1724 ROADS【最短路/搜索/DP】
    UVA 12716 GCD XOR【异或】
    UVA 10375 Choose and divide【唯一分解定理】
    UVA 12169 Disgruntled Judge【扩展欧几里德】
    UVA 11582 Colossal Fibonacci Numbers!【数学】
    011.progit笔记---git变基rebase
    010.progit笔记---git多个远程分支
    009.progit笔记---git单个远程分支
    008.progit笔记---git分支
    007.progit笔记---git别名
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/10152748.html
Copyright © 2011-2022 走看看