zoukankan      html  css  js  c++  java
  • Docker基本命令与使用 —— Dockerfile指令与构建(三)

    一.Dockerfile指令上

    1.指令格式

    # Comment 注释, 以#开头

    INSTRUCTION argument 以大写的指令+参数 

    #First Dockerfile 注释
    FROM ubuntu:14.04
    MAINTAINER dormancypress "dormancypress@outlook.com"
    RUN apt-get update
    RUN apt-get install -y nginx
    EXPOSE 80
     
    • From
    • MAINTAINER
    • RUN
    • EXPOSE 

    FROM指令

    FROM <image> / FROM <image>:<tag>
    • 已经存在的镜像
    • 基础镜像
    • 必须是第一条非注释指令
     

    MAINTAINER指令

    MAINTAINER <name>
    指定镜像的作者信息,包含镜像的所有者和联系信息
     

    RUN指令

    指定当前镜像中运行的命令,包含了两种命令模式
    • RUN<command> (shell模式)
    是以 /bin/sh -c command 形式执行命令
    eg. RUN echo hello
    • RUN ["executable", "param1", "param2" ] (exec模式)
    RUN ["/bin/bash", "-c", "echo hello"]
    镜像分层的概念,每一个run指令都会在当前镜像的上层创建一个新的镜像,来运行指定的命令
    RUN apt-get update && apt-get install -y nginx 将两条run指令合并成一条,会比原来的构建过程少了一步
     

    EXPOSE指令

    EXPOSE <port>[<port>...]
    指定运行该镜像的容器使用的端口,一个或多个,也可以在一个dockerfile中使用多个expose命令。但是在run一个容器时,还是必须指定容器的端口映射,如 docker run -p 80 -d test1 nginx。EXPOSE指令只是docker该容器内的应用程序会使用特定的端口,但出于安全的考虑,docker并不会自动的打开端口,而需要在使用时在run命令中添加对端口的映射。
     

    二.Dockerfile指令下

    • CMD 在容器运行时运行的命令
    • ENTERYPOINT
    • ADD 设置镜像的目录和文件
    • COPY
    • VOLUME
    • WORKDIR 镜像在构建及容器运行时的环境设置
    • ENV
    • USER
    • ONBUILD 类似触发器的指令
     

    CMD指令

    CMD指令用来提供容器默认运行的命令,与RUN类似,但是RUN是在镜像构建时运行的,而CMD指定的命令是在容器运行时运行的。并且当我们用docker run 命令启动一个容器时,如果指定了容器运行时的命令,那么CMD命令中的指令会被覆盖,不会执行。CMD指令是用来指定容器运行时的默认行为。
    • CMD [ "executable", "param1", "param2"] (exec模式)
    • CMD command param1 param2 (shell模式)
    • CMD [ "param1", "param2"] (作为ENTRYPOINT指令的默认参数)
     

    ENTRYPOINT指令

    ENTRYPOINT指令和CMD指令很相似,唯一的区别就是不会被docker run 命令中的指令所覆盖(run中的指令无效)。如需覆盖,可以使用docker run --entrypoint。
    • ENTRYPOINT [ "executable", "param1", "param2"] (exec模式)
    • ENTRYPOINT command param1 param2 (shell模式)
     

    ADD指令

    将文件和目录复制到使用docker构建的镜像中。文件或者目录的来源可以是本地路径,也可以是远程的URL。如果是本地地址必须是构建目录中的相对地址,对于远程URL,Docker不推荐使用,更建议使用curl和wget命令来获取文件。目标路径需要指定镜像中的绝对路径。
    • ADD <src>...<dest>
    • ADD ["<src>"..."<dest>"] (适用于文件路径中有空格的情况)
     

    COPY指令

    类似ADD指令。区别在于ADD包含类似tar的解压功能,如果单纯复制文件,docker推荐使用COPY。
    • COPY <src>...<dest>
    • COPY ["<src>"..."<dest>"] (适用于文件路径中有空格的情况)
    eg. COPY index.html /usr/share/nginx/html/
     

    VOLUME指令

    VOLUME指令用来向基于镜像创建的容器添加卷。这个目录可以绕过联合文件系统,并提供如共享数据或者对数据持久化的功能。
    • VOLUME ["/data"]
     

    WORKDIR指令

    用来在从镜像创建一个新容器时,在容器内部设置工作目录。ENTERYPOINT或者CMD指定的命令都会在这个目录下执行,我们也可以使用这个指令在构建中为后续的指令指定工作目录。
    • WORKDIR /path/to/workdir
    需要注意的是WORKDIR通常需要指定绝对路径,如果使用了相对路径,那么工作路径会一直传递下去。如
    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd
    OUT: /a/b/c
     

    ENV指令

    用来设置环境变量,与WORKDIR指令类似。环境变量的指令可以作用在构建过程中,以及在运行过程中同样有效。
    • ENV <key> <value>
    • ENV <key> <Value> ...
     

    USER指令

    用来指定镜像会以什么样的用户运行。
    • USER daemon
    eg. USER nginx 基于该镜像启用的容器,就会以nginx用户身份来运行。
    USER user USER uid
    USER user:group USER uid:gid
    USER user:gid USER uid:group
    如果不使用USER指令来指定用户,那么默认会使用root用户。
     

    ONBUILD指令

    ONBUILD指令能够为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像时,这个触发器会被执行。当子镜像在构建时,会触发触发器中的指令。
    • ONBUILD [INSTRUCTION]
     

    三.Dockerfile构建过程

    • 从基础镜像运行一个容器
    • 执行一条指令,对容器做出修改
    • 执行类似docker commit的操作,提交一个新的镜像层
    • 再基于刚提交的镜像运行一个新容器
    • 执行Dockerfile中的下一条指令,直至所有指令执行完毕
     
    使用中间层镜像进行调试 —— 查找错误
    构建缓存
    不使用缓存
    • docker build --no-cache
    • Dockerfile 中的 ENV REFRESH_DATE 2015-04-01 之后变不再使用缓存
    查看镜像构建的过程
    • docker history [image]
  • 相关阅读:
    每日学习心得:找不到类型{0},它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素...中提供,cellspacing、rowspacing属性
    我所理解的设计模式(C++实现)——解释器模式(Interpreter Pattern)
    uva-112 Tree Summing
    带你走进EJB--它都有哪些Bean
    Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力
    Codeforces Round #356 (Div. 2) E. Bear and Square Grid 滑块
    《郭大侠的妹妹不可能那么可爱》 第一章 郭大侠那可爱的妹妹?
    Codeforces Round #356 (Div. 2) D. Bear and Tower of Cubes dfs
    Codeforces Round #356 (Div. 2) C. Bear and Prime 100 水题
    Codeforces Round #356 (Div. 2) B. Bear and Finding Criminal 水题
  • 原文地址:https://www.cnblogs.com/Hai--D/p/6991881.html
Copyright © 2011-2022 走看看