Docker Build系列之一:简介

文章来源:WorkMap技术博客-Docker Build

关于Docker Build

Docker Build 是 Docker 引擎最常用的功能之一。每当构建一个镜像时,都是在使用 Docker Build。

Docker Build 不仅是用于构建镜像的命令,也不仅仅是关于打包代码的。它属于一个完整的生态系统,支持很多常用的工作流工具,以及更复杂和高级场景。

Docker Build架构

Docker Build是一个client-server架构。Buildx是客户端,Builder是服务端。在Docker Engine 23.0和Docker Desktop 4.19之后,执行Docker build命令,默认使用Buildx客户端;在之前,需要显式的调用Docker Buildx Build才会使用Buildx工具。
在这里插入图片描述

Docker Build执行流程

BuildKit是执行构建工作的守护进程。
调用 docker build 命令后,由Buildx解析构建命令,然后向BuildKit发送构建请求。构建请求的内容包括:

  • Dockerfile
  • 构建参数
  • 导出选项
  • 缓存选项

BuildKit 解析构建请求并执行构建步骤。
在构建期间,Buildx监视构建状态并将进度打印到终端。如果构建需要来自客户端的资源,例如本地文件或构建密钥,则 BuildKit 会从 Buildx 请求所需的资源。这是 BuildKit 相对于它替代的传统构建器更高效的一种方式。与之相比,BuildKit 仅在需要时请求构建所需的资源。传统构建器则始终会复制本地文件系统。BuildKit 可以从 Buildx 请求的资源包括:

  • 本地文件系统构建上下文
  • 构建密钥
  • SSH 套接字
  • 注册表认证令牌。

一个构建流程示例:
在这里插入图片描述

怎么使用Docker Build

构建的核心是Dockerfile。
Docker 通过读取 Dockerfile 中的指令来构建镜像。Dockerfile是一个文本文件,通过一系列指令将应用程序组装成容器镜像。

下是最常见的指令类型:

  • FROM 指定基础镜像。
  • RUN 在当前镜像的顶部新建一个层并执行任何命令,然后提交结果。RUN 还有一种 shell 形式用于运行命令。
  • WORKDIR 为随后的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录。
  • COPY 从 复制新文件或目录,并将它们添加到容器的文件系统中,路径为 。
  • CMD 定义由本镜像启动容器时运行的默认程序。每个 Dockerfile 只有一个 CMD语句,当存在多个 CMD 语句时,只有最后一个 CMD 语句会被使用.

Dockerfile 的默认文件名是 Dockerfile,不带文件扩展名。
执行docker build 命令会默认查找目录下的名字为Dockerfile的文件。也可以通过 docker build --file(或 -f 简写)指定特定的Dockerfile。

示例

  1. 新建目录,目录下新建一个hello.py文件,其内容如下:

    from flask import Flask
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
     return "Hello World!"
    
  2. 同一目录下,创建Dockerfile,内容如下

    # 表示基础镜像为Ubuntu的22.04版本
    FROM ubuntu:22.04
    
    # 安装python的运行时环境
    RUN apt-get update && apt-get install -y python3 python3-pip
    RUN pip install flask==2.1.*
    
    # 把第一步中的代码拷贝到根目录下
    COPY hello.py /
    # 配置一些环境变量
    ENV FLASK_APP=hello
    # 表示根据这个镜像构建的容器,监听的端口是8000
    EXPOSE 8000
    # 运行程序的命令
    CMD flask run --host 0.0.0.0 --port 8000
    
  3. 在当前目录下,执行命令

    docker build -t test:latest .
    

    其中,test是构建的镜像名,latest是tag,表示版本

  4. 运行这个镜像

    docker run -p 8000:8000 test:latest