Docker系列之四:Docker Build(一)

Docker系列之四:Docker Build(一)

文章来源:Docker Build介绍 · WorkMap技术博客

关于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 请求的资源包括:

  1. 本地文件系统构建上下文
  2. 构建密钥
  3. SSH 套接字
  4. 注册表认证令牌

一个构建流程示例:

怎么使用Docker Build

构建的核心是Dockerfile。

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

下是最常见的指令类型:

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

Dockerfile 的默认文件名是 Dockerfile,不带文件扩展名。

执行docker build 命令会默认查找目录下的名字为Dockerfile的文件。

也可以通过 docker build --file(或 -f 简写)指定特定的Dockerfile。

docker build示例

  • 新建目录,目录下新建一个hello.py文件,其内容如下:
   from flask import Flask
   app = Flask(__name__)
   
   @app.route("/")
   def hello():
    return "Hello World!" 
  • 同一目录下,创建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
  • 在当前目录下,执行命令
docker build -t test:latest .
其中,test是构建的镜像名,latest是tag,表示版本
  • 运行这个镜像
docker run -p 8000:8000 test:latest

编辑于 2023-07-28 17:08・IP 属地北京