Docker-Dockerfile

作者: meieugene | 来源:发表于2018-04-07 01:13 被阅读12次

    Dockerfile

    docker可以通过Dockerfile的内容来自动构建镜像。
    Dockerfile是一个创建镜像使用的命令的文本文件,使用docker build命令也可以配置Dockerfile中相应的内容来构建镜像。

    Dockerfile的指令选项:

    • FROM
    • MAINTAINER
    • RUN
    • CMD
    • EXPOSE
    • ENV
    • ADD
    • COPY
    • ENTRYPOINT
    • VOLUME
    • USER
    • WORKDIR
    • ONBUILD

    一、FROM

    用法:

    FROM <image>​​
    
    • FROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。
    • FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。
    • FROM可以在一个 Dockerfile 中出现多次,即可在一个 Dockerfile 中创建多个镜像。
    • 如果FROM语句没有指定镜像标签,则默认使用latest标签。

    二、MAINTAINER

    用法:

     MAINTAINER <name> 
    

    指定创建镜像的用户。

    三、RUN

    用法:

    RUN yum install -y nginx        
    

    RUN是在构建镜像时,在基础镜像(即:FROM指令引入的基础镜像源)上安装一些软件或者对基础镜像最一些操作。

    注:
    为保持可读性、方便理解、可维护性,可把长或者复杂的RUN语句使用\分隔符分成多行

    例如:

    FROM centos
    MAINTAINER eugene
    RUN yum install -y nginx
    RUN echo 'hello world'>/index.html
    

    以上两个RUN指令分别是在构建镜像时对基础镜像centos,安装了nginx和对index.html写入内容。

    四、CMD

    三种用法:

    CMD ["executable","param1","param2"] #使用exec执行,推荐方式
    CMD command param1 param2 #在/bin/sh中执行,提供给需要交互的应用
    CMD ["param1","param2"] #提供给ENTRYPOINT的默认参数
    

    CMD指令在Dockerfile中只能使用一次,如果存在多个,只有最后一个生效。
    CMD是为了在启动容器的时候提供一个默认的命令执行选项。
    CMD也可指定容器启动时需要运行的程序。
    如果在启动容器的时候指定了运行命令,那么该命令会覆盖Dockerfile中的CMD指令。
    例如:

    CMD ['/bin/bash']
    

    如果在启动docker时输入:

    docker run -it ubuntu /bin/bash
    

    那么此时docker run中的/bin/bash会替代Dockerfile中/bin/bash生效。
    即,启动时可简输入:

    docker run -it ubuntu
    

    注:
    CMD只有启动容器的时候才执行,在build的时候不执行;
    RUN只有构建镜像的时候才执行,在run的时候不执行。

    五、EXPOSE

    用法:

    EXPOSE <port> [<port>...]​#可配置多个端口号
    

    告诉Docker服务端容器暴露的端口号,供互联系统使用。
    在启动时使用docker run -p才生效。

    六、ENV

    用法:

    ENV <key> <value>    #设置一个变量
    ENV <key>=<value>    #设置多个变量​
    

    设置一个/多个环节变量,以供后续RUN指令(即在对基础镜像做操作时)使用,变量在容器运行时保留。
    例如:

    ENV NG nginx
    ENV indexName index
    RUN yum install -y $NG #引用NG变量
    RUN echo 'hello world'>/$indexName.html   ​
    

    七、ADD

    用法:

    ADD <src> ... <dest>​
    

    ADD复制本地主机文件、目录或者远程文件urls到容器的指定路径中。
    例如:

    ADD http://xxx.com/xxx.png /tmp/xxx.png ​
    

    以上表示将xxx.png复制到容器的tmp目录下。
    ADD能自动解压。

    注:
    如果源路径的资源发生变化,则该ADD指令将使Docker Cache失效,Dockerfile中后续的所有指令都不能使用缓存;
    因此尽量将ADD指令放在Dockerfile的最后。

    八、COPY

    用法:

    COPY <src>... <dest>
    

    COPY是复制文件或者目录到容器指定位置。
    与ADD的唯一区别是,COPY不能指定远程文件urls。

    九、ENTRYPOINT

    两种用法:

    ENTRYPOINT ["executable", "param1", "param2"]
    ENTRYPOINT command param1 param2 #(shell中执行)​
    

    ENTRYPOINT指令效果与CMD类似,即都是在容器启动时有效,指定一个程序在容器启动时运行。
    CMD与ENTRYPOINT最大的不同之处,就是在于用法上。
    例如:

    FROM centos
    MAINTAINER eugene
    RUN yum install -y nginx RUN echo 'hello world' > /usr/share/nginx/html/index.html
    EXPOSE 80
    ENTRYPOINT ["/usr/sbin/nginx"]​# 指定容器在启动时运行nginx
    

    注:
    不可被docker run提供的参数覆盖;
    每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。

    十、USER

    用法:

    USER daemon​
    

    指定容器运行时的用户名或uid。

    十一、WORKDIR

    用法:

    WORKDIR /path # 也可使用ENV设置的变量
    

    为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。

    十二、ONBUILD

    用法:

    ONBUILD [instruction]
    

    配置当当前所创建的镜像作为其它镜像的基础镜像时,所要执行的指令。

    例如:

    ONBUILD ADD http://xxx.com/xxx.png /tmp/xxx.png  ​
    

    即,当新的Dockerfile将以上镜像作为基础镜像时,会执行ADD指令。

    十三、VOLUME

    用法:

    VOLUME ['/data']​
    

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

    • volume在容器创建时就初始化,在容器运行时就可以使用其中的文件

    • volume能在不同的容器之间共享和重用

    • 对volume中的数据的操作会马上生效

    • 对volume中数据操作不会影响到镜像本身

    • volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被Docker删除

    相关文章

      网友评论

        本文标题:Docker-Dockerfile

        本文链接:https://www.haomeiwen.com/subject/uzsehftx.html