zoukankan      html  css  js  c++  java
  • 一张图学dockerfile

     
     
    Dockerfile是为快速构建docker image而设计的,当你使用dockerbuild 命令的时候,docker 会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行里面的指令构建出一个docker image。这比SaltStack的配置管理要简单的多,不过还是要掌握一些简单的指令。
    Dockerfile 由一行行命令语句组成,并且支持以#开头的注释行。指令是不区分大小写的,但是通常我们都大写。
     
    下面我们通过构建一个Nginx的镜像来学习Dockerfile
     

    Nginx Dockerfile实战

    注意:第一个指令必须是FROM。
    为了大家更容易学习,我这里总结一个命令的介绍:
    一般的,我们将Dockerfile 分为四部分:
    • 基础镜像信息
    • 维护者信息
    • 镜像操作指令
    • 容器启动时执行指令
     
    这就是学会Dockerfile的一张图

     上图最后一个RUN应该为CMD

    一. 构建Dockerfile

    注意:ADD index.html就是放一个文件进去,这个文件需要大家自己准备一下。例如:
    [root@linux-node1 mynginx]# echo “nginx indocker test” > index.html
    使用dokcer build命令构建镜像
     [root@linux-node1mynginx]# docker build -t mynginx:v2 .
    构建完毕之后,我们就可以Run起来。
    [root@linux-node1 ~]# docker run -d -p92:80 nginx:v2 nginx
     

     

    二. Dockerfile指令详解

     

    1. FROM

    格式:FROM<image>或FROM<image>:<tag>。
    解释:FROM是Dockerfile里的第一条指令(必须是),后面跟有效的镜像名(如果该镜像你的本地仓库没有则会从远程仓库Pull取)。然后后面的其它指令FROM的镜像中执行。
     
     

    2. MAINTAINER

    格式:MAINTAINER <name>
    解释:指定维护者信息。
     
     

    3. RUN:在镜像构建过程中运行。

     
    格式:RUN <command>或 RUN[“executable”, “param1”, “param2”](exec模式)
     解释:运行命令,命令较长使可以使用来换行。推荐使用上面数组的格式
     
     例如: shell模式:RUN echo hello 执行的方式是用shell来执行,实际效果是 /bin/sh -c echo hello
              
                exec模式:可以指定其他形式的shell来执行指令
                RUN ["/bin/bash", "-c", "echo hello"]
               
    两条RUN指令可以合并成一条, 例如:RUN apt-get update && apt-get -y nginx
     
    docker build -t="镜像名" .   在当前目录构建镜像,注意后面的 点 表示当前目录
     
     

    4. CMD:指定容器启动时的默认行为

    格式:
    CMD [“executable”,”param1″,”param2″] 使用 exec 执行,推荐方式;
    CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
    CMD [“param1″,”param2”] 提供给ENTRYPOINT的默认参数,和ENTRYPOINT搭配使用
     
    解释:
    CMD指定容器启动时执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。
     
    例如:使用exec方式
    在dockerfile中添加 CMD ["/usr/sbin/nginx", "-g",  "daemon off;"]  启动容器时运行nginx, 并且以前台方式运行。
     
    这样使用命令docker build -t="home/hong"(给镜像起名) .  构建一个home/hong的镜像后,
    启动容器:docker run -d -p 80 --name cmd_test1 home/hong ---------不用再写容器启动的命令nginx -g "daemon off;")
     
    之前不加CMD时,
    启动容器:docker run -p 80 -d home/hong nginx -g "daemon off;"
     
    如果使用命令docker run -d -p 80 --name cmd_test2 home/hong /bin/bash来启动一个容器,
    再用docker ps -l 查看(显示最后一次创建的容器,包括未运行的),发现COMMAND列显示的内容已经变化为/bin/bash, 之前是/usr/sbin/nginx -g 
     
    可以用docker top cmd_test1来查看容器的进程。
     
     

    5. ENTRYPOINT

    格式:
     
    ENTRYPOINT [“executable”, “param1″,”param2”]
     
    ENTRYPOINT command param1 param2(shell中执行)。
     
    例如:ENTRYPOINT ["/usr/sbin/nginx", "-g",  "daemon off;"]
     
    解释:和CMD类似,区别:不可被 docker run 提供的参数覆盖。
    每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,也就是你启动容器的时候增加运行的命令不会覆盖ENTRYPOINT指定的命令。
     
    所以生产实践中我们可以同时使用ENTRYPOINT和CMD,使用ENTRYPOINT来指定命令,用CMD来指定命令默认的参数
    例如在dockerfile中写入如下命令来构建镜像后:
    ENTRYPOINT ["/usr/sbin/nginx"]
    CMD ["-h"]
     
    启动容器:docker run -d -p 80 --name ep_test1 home/hong -g "daemon off"  
    使用docker ps查看,显示的COMMAND参数为 /usr/sbin/nginx -g表示CMD的默认参数被-g参数覆盖了
     
     
     

    6.  USER --这个用户不会自动创建

     
    格式:USER daemon
    例如:USER user                    USER uid
             USER user:group          USER uid:gid
             USER user:gid               USER uid:group
     
    解释:指定运行容器时的用户名和UID,后续的RUN指令也会使用这里指定的用户,默认会使用root用户
     
     

    7. EXPOSE

     
    格式:EXPOSE<port> [<port>…]   :指定运行该镜像的容器使用的端口,只是告诉别人我要用某个端口,但是并不会自动打开此端口,所以启动容器是还需要用参数-p或者-P来指定开启的端口号
     
    例如:dockerfile中 EXPOSE 80
     
    在容器运行时 docker run -p 80 -d home/hong nginx -g "daemon off;"
     
     
     

    8. ENV

     
    格式:ENV<key> <value>
              ENV <key>=<value> …
    解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定
     
     

    9. ADD

    格式:
    ADD <src>… <dest>
    ADD [“<src>”,… “<dest>”]
     
    例子: ADD index.html /usr/share/nginx/html/  使用本地编写的网页,替换nginx的默认页面
     
    解释:将指定的<src>复制到容器文件系统中的<dest>,
    1. 一般来说src地址为本机dockerfile所在的目录,目标路径要使用容器中的绝对路径,
    2. 所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0
    3. 如果文件是可识别的压缩格式,则docker会帮忙解压缩,还有一个COPY指令,和ADD用法完全一样,只是没解压缩功能,如果是纯拷贝,使用COPY好。
     
     

    10. VOLUME

    格式:VOLUME [“/data”]
    解释:可以将本地文件夹或者其他container的文件夹挂载到container中。
     
     

    11. WORKDIR:容器内部设置工作目录

    格式:WORKDIR/path/to/workdir
    解释:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。
    可以多次切换(相当于cd命令),
     
    也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如                 
    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd
     
    则最终路径为 /a/b/c。
     
     
     

    12. ONBUILD:为镜像添加触发器

     
    ONBUILD 指定的命令在构建镜像时并不执行, 而是在它的子镜像中执行;
    只有当一个镜像被其他镜像作为基础镜像时才会执行,会在构建过程中插入指令
     
    例子,dockerfile文件如下
    FROM ubuntu:14.04
    RUN apt-get update
    RUN apt-get install -y nginx
    ONBUILD COPY index.html /usr/share/nginx/html/ #使用本地编写的网页,替换nginx的默认页面
    EXPOSE 80
    ENTRYPOINT ["/usr/sbin/nginx","-g",daemon off;"]
    构建此镜像 docker build -t "home/hong" .   
     
    然后按此镜像运行容器docker run -d -p 80 --name test0 home/hong
    curl http://127.0.0.1:49169来查看页面,发现默认页面并没有改变
     
    再写一个dockerfile文件
    FROM home/hong
    EXPOSE 80
    ENTRYPOINT ["/usr/sbin/nginx","-g",daemon off;"]
    再构建镜像docker build -t "test 1" .    在构建过程中发现触发了ONBUILD指令。
     
     

    13. ARG

    格式:ARG<name>[=<default value>]
     
    解释:ARG指定了一个变量在docker build的时候使用,可以使用–build-arg <varname>=<value>来指定参数的值,不过如果构建的时候不指定就会报错。
     
     
     
     
     
  • 相关阅读:
    排查线上问题常用的几个Linux命令
    OAuth2简易实战(一)-四种模式
    程序员必备的网站推荐
    C++ sizeof
    C++ 求余运算符
    C++ mutable(可变的)
    C++ const_cast用法
    C++常变量和文字常量
    C++中 <iso646.h>头文件
    java-网络编程-使用URLDecoder和URLEncoder
  • 原文地址:https://www.cnblogs.com/regit/p/8295712.html
Copyright © 2011-2022 走看看