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。
示例
-
新建目录,目录下新建一个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