• Docker之Dockerfile


    1、Dockerfile

    1.1、dockerfile的基本介绍

    Dockerfile 是一个用来构建镜像的文本文件,该文本内容内包含了一条条构建镜像所需的指令和参数。Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

    DockerFile 对于 docker 镜像而言,可以理解为就如同 java 中某个类的 .class 文件对应上该类的 .java 文件。

    从应用软件的角度来看,Dockerfile、 Docker镜像与Docker容器分别代表软件的三个不同阶段:

    • Dockerfile是软件的原材料
    • Docker镜像是软件的交付品
    • Docker容器则可以认为是软件的运行态。

    Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

    1.2、dockerfile内容

    Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令。

    文件内容说明:

    • 每条保留字指令都必须为大写字母且后面要跟随至少一个数
    • 指令按照从上到下,顺序执行
    • 每条指令都会创建一个新的镜像层,并对镜像进行提交
    • #表示注释

    2、Dockerfile常用指令

    常用指令图:

    2.1、FROM(指定基础镜像)

    FROM:指定基础镜像,即当前镜像基于哪个镜像创建的。该指令必须为第一个命令。

    示例:

    FROM centos:6

    2.2、MAINTAINER(指定维护者信息)

    指明镜像维护者及其联系方式(一般是邮箱地址),例如:

    MAINTAINER xxx <xxx@qq.com>

    不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如:

    LABEL maintainer="edisonzhou.cn"

    2.3、RUN

    镜像构建时运行的命令,例如:

    RUN ["yum", "install", "httpd"]
    RUN yum install vim   #安装vim模块
    RUN yum install net-tools     

    2.4、EXPOSE

    声明容器运行的该容器暴露的服务端口,例如:

    EXPOSE 80 443

    2.5、CMD

    启动容器时执行的Shell命令,例如:

    CMD ["-C", "/start.sh"] 
    CMD echo "success----ok"
    CMD /bin/bash

    Dockerfile 文件中可以存在多个 CMD 指令,但仅有最后一个会生效。并且 CMD 启动的程序会被 docker run 命令行最后所指定的参数所覆盖。

    2.6、WORKDIR

    指定在创建并运行容器后,默认进去的容器的目录。如果没有指定,将默认进去容器内的根目录 / 下。

    也是为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:

    WORKDIR /data

    2.7、ENV

    设置环境变量,例如:

    ENV MY_PATH /usr/test
    ENV MYSQL_ROOT_PASSWORD 123456
    ENV JAVA_HOME /usr/local/jdk1.8.0_45

    设置的环境变量可以在后续的任何RUN指令中使用,也可以在其它指令中直接使用这些环境变量。比如:WORKDIR $MY_PATH

    2.8、COPY

    将宿主机目录下的文件或者目录拷贝进镜像中,例如:

    COPY ./start.sh /start.sh

    2.9、ADD

    将宿主机目录下的文件或者目录拷贝进镜像中,相对于 COPY 命令的区别是如果是URL或压缩包,会自动下载或自动解压。

    例如:

    ADD 宿主机文件路径 镜像文件路径
    ADD html.tar.gz /var/www/html
    ADD https://xxx.com/html.tar.gz /var/www/html

    2.10、VOLUME

    指定容器挂载点到宿主机自动生成的目录或其他容器,例如:

    VOLUME ["/var/lib/mysql"]

    一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。

    2.11、ENTRYPOINT

    启动容器时执行的Shell命令,同CMD类似,只是由 ENTRYPOINT 启动的程序不会被 docker run 命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给 ENTRYPOINT 指定的程序。

    例如:

    ENTRYPOINT ["/bin/bash", "-C", "/start.sh"]
    ENTRYPOINT /bin/bash -C '/start.sh'

    Dockerfile 文件中也可以存在多个 ENTRYPOINT 指令,但仅有最后一个会生效。

    2.12、ONBUILD

    用于设置镜像触发器,当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器就会被触发。

    2.13、USER

    指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

    # 格式:
      USER user
      USER user:group
      USER uid
      USER uid:gid
      USER user:gid
      USER uid:group
    
    # 示例:
      USER wen

    使用USER指定用户后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT 都将使用该用户。镜像构建完成后,通过 docker run 运行容器时,可以通过 -u 参数来覆盖所指定的用户。

  • 相关阅读:
    Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》
    Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》
    Android Studio突然不显示logcat日志
    Xcode 调试技巧 --常用命令和断点
    (译)Objective-C 类属性
    Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》
    Android Studio 中设置代码块自动补齐
    RunLoop总结:RunLoop的应用场景(三)
    Android Studio精彩案例(三)《模仿微信ViewPage+Fragment实现方式二》
    .net学习视屏
  • 原文地址:https://www.cnblogs.com/wenxuehai/p/15159370.html
Copyright © 2020-2023  润新知