zoukankan      html  css  js  c++  java
  • Docker之Dockerfile

    1. 什么是 Dockerfile?

    Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。

    image.png
    通过架构图可以看出通过DockerFile可以直接构建镜像

    2. Dockerfile 解析过程

    image.png

    3. Dockerfile 保留命令

    保留字 作用
    FROM 当前镜像是基于哪个镜像的 第一个指令必须是FROM
    MAINTAINER 镜像维护者的姓名和邮箱地址
    RUN 构建镜像时需要运行的指令
    EXPOSE 当前容器对外暴露出的端口号
    WORKDIR 指定在创建容器后,终端默认登录进来的工作目录。相当于进入容器内部后,使用pwd查看到的目录。
    ENV 用来在构建镜像过程中设置环境变量
    ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar
    COPY 类似于ADD,拷贝文件和目录到镜像中将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的目标路径位置
    VOLUME 容器数据卷,用于数据保存和持久化工作
    CMD 指定一个容器启动时要运行的命令。Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
    ENTRYPOINTE 指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数

    3.1 From命令

    基于那个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指令出现

    语法:
    FROM  <image>
    FROM  <image>[:<tag>]     使用版本不写为latest
    FROM  <image>[@<digest>]  使用摘要
    

    3.2 MAINTAINER 命令

    镜像维护者的姓名和邮箱地址[废弃]
    
    语法:
      MAINTAINER <name>
    

    3.3 RUN 命令

    RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步

    语法:
    RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
    RUN echo hello
    
    RUN ["executable", "param1", "param2"] (exec form)
    RUN ["/bin/bash", "-c", "echo hello"]
    

    3.4 EXPOSE 命令

    用来指定构建的镜像在运行为容器时对外暴露的端口

    语法:
    EXPOSE 80/tcp  如果没有显示指定则默认暴露都是tcp
    EXPOSE 80/udp
    

    3.5 CMD 命令

    用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

    语法:
    CMD ["executable","param1","param2"] (exec form, this is the preferred form)
    CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
    CMD command param1 param2 (shell form)
    

    3.6 WORKDIR 命令

    用来为Dockerfile中的任何RUNCMDENTRYPOINTCOPYADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。

    语法:
    WORKDIR /path/to/workdir
    
    WORKDIR /a
    WORKDIR b
    WORKDIR c
    注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对
    

    3.7 ENV 命令

    用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。

    语法:
    ENV <key> <value>
    ENV <key>=<value> ... 
    

    3.8 ADD 命令

    用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。

    语法:
    ADD hom* /mydir/       通配符添加多个文件
    ADD hom?.txt /mydir/   通配符添加
    ADD test.txt relativeDir/  可以指定相对路径
    ADD test.txt /absoluteDir/ 也可以指定绝对路径
    ADD url 
    

    3.9 COPY 命令

    用来将context目录中指定文件复制到镜像的指定目录中

    语法:
    COPY src dest
    COPY ["<src>",... "<dest>"]
    

    3.10 VOLUME 命令

    用来定义容器运行时可以挂在到宿主机的目录,在运行容器的时候添加参数:-v 宿主机目录:容器目录

    语法:
    VOLUME ["/data"]
    

    3.11 ENTRYPOINT命令

    用来指定容器启动时执行命令和CMD类似

    语法:
    ENTRYPOINT ["executable", "param1", "param2"]
    ENTRYPOINT command param1 param2
    
    ENTRYPOINT指令,往往用于设置容器启动后的**第一个命令**,这对一个容器来说往往是固定的。
    CMD指令,往往用于设置容器启动的第一个命令的**默认参数**,这对一个容器来说可以是变化的。
    

    4.Dockerfile 构建镜像实战

    4.1构建Flask镜像

    4.1.1 目录结构
    ├──src
    │   ├──  app.py
    ├──Dockerfile
    ├──requirements.txt
    
    4.1.2 app.py 文件内容
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello(): 
        return 'hello Dockerfile部署Flask'
    
    if __name__ == '__main__':
        app.run(host="0.0.0.0")
    
    4.1.3 requirements.txt文件内容
    Flask==1.1.2
    
    4.1.4 Dockerfile 文件内容
    FROM python:3.6.8
    
    COPY . /app
    WORKDIR /app/src
    
    RUN pip install -r /app/requirements.txt -i https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
    
    CMD python app.py
    # 注意:app文件夹本身就是存在于镜像中的。
    
    4.1.5 构建镜像
    docker build -t test:1.0 .
    
    4.1.6 运行容器
    docker run -itd -p 5001:5000 test:1.0
    
  • 相关阅读:
    FireFox 中 回把nextSibling为/n 换行时解释为undefinded
    陶哲轩实分析习题18.4.10
    单调可测集的测度运算
    数学分析_Tom Apostol_定理7.47
    Emacs+$\LaTeX$ 帮你写数学文章
    陶哲轩实分析引理18.4.2:半空间是可测集
    陶哲轩实分析习题18.4.10
    陶哲轩实分析引理18.4.2:半空间是可测集
    可测集的性质
    数学分析_Tom Apostol_定理7.47
  • 原文地址:https://www.cnblogs.com/aze999/p/14955414.html
Copyright © 2011-2022 走看看