zoukankan      html  css  js  c++  java
  • Dockerfile常用指令使用案例

     ARG使用案例

    ARG:定义创建镜像过程中使用的变量。镜像编译成功后,ARG指定的变量将不再存在。

    登录容器后使用命令:env是查看不到的!

    ENV使用案例

    FROM centos:7
    ENV NODE_VERSION 1.2.3
    WORKDIR /
    
    RUN useradd www
    EXPOSE 22
    VOLUME /huazai
    
    [root@server01 ~]# docker run  -it aa:v9  /bin/bash
    [root@c89864248c57 /]# env
    NODE_VERSION=1.2.3
    

    WORKDIR使用案例:

    [root@server01 ~]# cat  Dockerfile 
    FROM centos:7
    WORKDIR /tmp
    CMD ["pwd"]
    
    [root@server01 ~]# docker run aa:v2
    /tmp
    

    USER 使用案例:

    [root@server01 ~]# cat  Dockerfile 
    FROM centos:7
    RUN useradd www
    USER www
    RUN yum update
    

     报错信息:说用后续的RUN指令也会使用指定的用户www来执行 yum update命令  没有执行权限

    ovl: Error while doing RPMdb copy-up:
    [Errno 13] Permission denied: '/var/lib/rpm/.dbenv.lock'
    You need to be root to perform this command.

    ADD 和COPY使用案例

    add有解压的功能

    [root@server01 ~]# cat Dockerfile 
    FROM centos:7
    
    WORKDIR /tmp
    
    ADD busybox.tar.gz /tmp/
    COPY busybox.tar.gz /usr/local/src/
    CMD ["pwd"]
    

     VOLUME 使用案例,不用声明也可以直接挂载,在容器内部会自动生成一个目录的(疑问!)

    [root@server01 ~]# cat Dockerfile 
    FROM centos:7
    
    VOLUME /huazai
    CMD ["pwd"]
    
    [root@server01 ~]# docker run -it  -v /usr/local/src:/huazai aa:v8  /bin/bash
    [root@601081c78d83 tmp]# ls /huazai/
    ELK.zip              nginx-1.14.2/        redis-5.0.2/         workshop/
    lnmp/                nginx-1.14.2.tar.gz  redis-5.0.2.tar.gz   
    

     ONBUILD 使用案例:创建子镜像时指定自动执行的操作传指令

    父镜像Dockerfile

    FROM centos:7
    RUN yum -y install httpd-tools
    ONBUILD ADD redis-5.0.2.tar.gz /tmp/
    CMD ["ping","-c2","www.baidu.com"]
    

    docker build -t bb:v2 .

    将父镜像构建为bb:v2

    子镜像Dockerfile

    FROM bb:v2
    RUN yum -y install curl
    ENTRYPOINT ["curl","-s","https://www.baidu.com"]
    

    HEALTHCHECK使用案例:

    当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting

    在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy

    HEALTHCHECK 支持下列选项:

    • --interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
    • --timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
    • --retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。

    和 CMDENTRYPOINT 一样,HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效。

    在 HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。

    命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败;2:保留,不要使用这个值。

    假设我们有个镜像是个最简单的 Web 服务,我们希望增加健康检查来判断其 Web 服务是否在正常工作,

    我们可以用 curl 来帮助判断,其 Dockerfile 的 HEALTHCHECK 可以这么写:

    1. FROM nginx
    2. HEALTHCHECK --interval=5s --timeout=3s
    3. CMD curl -fs http://localhost/ || exit 1

    这里我们设置了每 5 秒检查一次(这里为了试验所以间隔非常短,实际应该相对较长),

    如果健康检查命令超过 3 秒没响应就视为失败,并且使用 curl -fs http://localhost/ || exit 1 作为健康检查命令。

    使用 docker build 来构建这个镜像:

    1. $ docker build -t myweb:v1 .

    构建好了后,我们启动一个容器:

    1. $ docker run ---name web -80:80 myweb:v1

    当运行该镜像后,可以通过 docker container ls 看到最初的状态为 (health: starting)

    1. $ docker container ls
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. 03e28eb00bd0 myweb:v1 "nginx -g 'daemon off" 3 seconds ago Up 2 seconds (health: starting) 80/tcp, 443/tcp web

    在等待几秒钟后,再次 docker container ls,就会看到健康状态变化为了 (healthy)

    1. $ docker container ls
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. 03e28eb00bd0 myweb:v1 "nginx -g 'daemon off" 18 seconds ago Up 16 seconds (healthy) 80/tcp, 443/tcp web

    如果健康检查连续失败超过了重试次数,状态就会变为 (unhealthy)

  • 相关阅读:
    HttpUtils 用于进行网络请求的工具类
    Java 身份证工具类
    MD5加密Java工具类
    Nginx配置文件详细说明
    java统计abacbacdadbc中的每个字母出现的次数,输出格式是:a(4)b(3)c(3)d(2)
    mysql查询今天,昨天,近7天,近30天,本月,上一月数据的SQL
    Java随机生成常用汉字验证码
    Google Kaptcha验证码的使用
    Linux查看CPU和内存使用情况
    myql导入导出命令
  • 原文地址:https://www.cnblogs.com/xiaonan1/p/12965775.html
Copyright © 2011-2022 走看看