🐳 Docker Buildx
Docker Buildx 是 Docker 的新成员,它为 Docker 构建功能带来了全新的体验。让我们来深入了解它的魔法。
🔍 什么是 Docker Buildx?
Docker Buildx 是 Docker CLI 的一个插件,它为 Docker 构建提供了全新的功能。它不仅保留了标准 docker build
的所有功能,还加入了一些强大的新功能。
🌟 主要特点:
多平台构建:
你可以在单个命令中为多个平台构建Docker镜像。🎬 示例: 想象一下,你正在制作一个应用程序,并想让它在 Windows、Linux 和 ARM 架构上都能运行。使用 Buildx,你可以同时为所有这些平台构建镜像,而不需要单独为每个平台构建。构建缓存:
Buildx 支持高级构建缓存,使得构建过程更快。🎬 示例: 这就像一个智能的咖啡机,它记得你上次的选择并提前为你准备好,这样你每次都可以更快地得到你的咖啡。并行构建:
你可以同时构建多个镜像。🎬 示例: 就像你有多个炉子一样,你可以在每个炉子上烹饪不同的食物,而不是等待一个食物烹饪完再开始另一个。📌 兼容性:
Docker Buildx 功能仅适用于 Docker v19.03+ 版本。如果你使用的是更早的版本,你需要升级你的 Docker 以使用这个强大的功能。
🔗 如何开始?
由于 Buildx 是 Docker CLI 的一个插件,你可能需要单独安装它。一旦安装完成,你就可以使用 docker buildx
命令开始你的多平台构建之旅了!
🛠 BuildKit
BuildKit 是 Docker 的下一代构建工具,专为现代容器和微服务工作负载设计,它在 GitHub 上开源。
🚫 注意事项:
如果你使用的是云服务商(如腾讯云容器服务、阿里云容器服务等)提供的镜像构建服务,请注意,由于他们使用的 Docker 版本可能低于 18.09,所以 BuildKit 无法使用,可能会导致构建失败。建议在使用 BuildKit 时创建一个新的 Dockerfile(例如 Dockerfile.buildkit
)。
🌐 集成与支持:
Docker Hub 的自动构建已经支持 buildkit,具体可以参考 这里。
📚 Dockerfile 的新指令:
启用 BuildKit 后,我们可以使用以下新指令来优化和加速镜像构建:
RUN --mount=type=cache
:
# 使用实验性的 Dockerfile 语法# syntax = docker/dockerfile:experimental# 使用 node 的 alpine 版本作为基础镜像FROM node:alpine# 设置工作目录WORKDIR /app# 复制 package.json 到工作目录COPY package.json /app/# 使用缓存挂载来缓存 node_modules,避免重复下载RUN --mount=type=cache,target=/app/node_modules npm install# 复制其他文件到工作目录COPY . /app/# 设置启动命令CMD ["npm", "start"]
RUN --mount=type=bind
:
# 使用实验性的 Dockerfile 语法# syntax = docker/dockerfile:experimental# 使用 alpine 作为基础镜像FROM alpine:latest# 从 php 的 alpine 版本镜像中绑定 php 可执行文件,并执行它RUN --mount=type=bind,from=php:alpine,source=/usr/local/bin/php,target=/usr/bin/php php -v
RUN --mount=type=tmpfs
:
# 使用实验性的 Dockerfile 语法# syntax = docker/dockerfile:experimental# 使用 alpine 作为基础镜像FROM alpine:latest# 挂载一个 tmpfs 文件系统到 /tmp/tempdir,并在其中创建一个文件RUN --mount=type=tmpfs,target=/tmp/tempdir touch /tmp/tempdir/hello.txt
RUN --mount=type=secret
:
# 使用实验性的 Dockerfile 语法# syntax = docker/dockerfile:experimental# 使用 alpine 作为基础镜像FROM alpine:latest# 使用密钥挂载来安全地读取密钥内容RUN --mount=type=secret,id=mysecret,target=/secrets/my_secret.txt cat /secrets/my_secret.txt
RUN --mount=type=ssh
:
# 使用实验性的 Dockerfile 语法# syntax = docker/dockerfile:experimental# 使用 alpine 作为基础镜像FROM alpine:latest# 安装 git 和 SSH 客户端RUN apk add --no-cache git openssh-client# 使用 SSH 挂载来克隆一个私有仓库RUN --mount=type=ssh git clone git@github.com:yourusername/private-repo.git
📋 Docker Compose 与 BuildKit:
为了在 docker-compose 构建中使用 BuildKit,你只需要设置 COMPOSE_DOCKER_CLI_BUILD=1
这个环境变量。
🔗 官方文档:
更多关于 BuildKit 和它的实验性特性的详细信息,可以在官方文档中找到。
🛠 Docker Buildx
Docker Buildx 是 Docker CLI 的一个扩展插件,提供了与传统的 docker build
类似的用户体验,但增加了一些新的功能和优化。
📌 使用方法:
要使用 docker buildx
构建镜像,你可以直接执行以下命令:
$ docker buildx build .
在执行上述命令时,你会看到构建的进度输出,例如:
[+] Building 8.4s (23/32) => ...
🌟 特点:
基于 BuildKit: Buildx 使用 BuildKit 作为后台构建工具,这意味着你可以利用 BuildKit 提供的所有新功能和优化。多平台支持: 与传统的docker build
不同,buildx
允许你为多个平台构建镜像,而无需切换 Docker 上下文。高级构建选项: Buildx 提供了一些高级构建选项,如构建缓存,构建参数等。 📘 更多信息:
Buildx 支持许多 BuildKit 的新功能,例如缓存控制、并行构建等。要了解更多关于这些特性的信息,你可以参考 BuildKit 的相关文档。
🔗 官方文档:
有关 docker buildx
的更多详细信息和使用方法,可以访问 Docker 的官方文档。
🚀 使用 Buildx 构建多种系统架构支持的 Docker 镜像
Docker Buildx 提供了一个简单而高效的方法,允许开发者在单次构建中为多种架构构建 Docker 镜像。下面是如何使用 Buildx 构建多种系统架构支持的 Docker 镜像的步骤。
🌟 1. 新建 Builder 实例
Docker for Linux 默认不支持构建 arm 架构镜像,首先要确保你的系统支持该特性:
$ docker run --rm --privileged tonistiigi/binfmt:latest --install all
然后,创建一个新的 builder 实例,以支持多平台构建:
$ docker buildx create --name mybuilder --driver docker-container$ docker buildx use mybuilder
🌟 2. 构建镜像
首先,你需要一个 Dockerfile。例如:
FROM --platform=$TARGETPLATFORM alpineRUN uname -a > /os.txtCMD cat /os.txt
接下来,使用 docker buildx build
命令来构建支持多种架构的镜像:
$ docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t myusername/hello . --push
🌟 3. 在不同的架构上运行镜像
你可以在不同的硬件架构上运行你的镜像,以验证它是否正确工作:
$ docker run -it --rm myusername/hello
🌟 4. 使用架构相关的变量
Dockerfile 支持一系列与架构相关的变量,例如 TARGETPLATFORM
, TARGETOS
, TARGETARCH
等。利用这些变量,你可以为不同的平台定制你的 Dockerfile。
例如,如果你已经为两个不同的平台生成了二进制文件,你可以这样使用这些变量:
FROM scratchARG TARGETOSARG TARGETARCHCOPY bin/dist-${TARGETOS}-${TARGETARCH} /distENTRYPOINT ["dist"]
📝 创建 Docker 镜像步骤
🔧 Dockerfile 示例
# 使用 Ubuntu 基础镜像FROM ubuntu:20.04# 设置非交互式前端ENV DEBIAN_FRONTEND=noninteractive# 安装 Node.js 和 npmRUN apt-get update && \ apt-get install -y nodejs npm && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*# 设置工作目录WORKDIR /app# 复制文件到容器COPY . /app# 安装依赖RUN npm install# 暴露端口EXPOSE 3000# 设置启动命令CMD ["node", "server.js"]
🛠️ 使用 Ubuntu 基础镜像: FROM ubuntu:20.04
🚫 设置非交互式前端: ENV DEBIAN_FRONTEND=noninteractive
📦 安装 Node.js 和 npm: 更新包列表: RUN apt-get update
安装 Node.js 和 npm: RUN apt-get install -y nodejs npm
清理缓存: RUN apt-get clean
删除不必要的文件: RUN rm -rf /var/lib/apt/lists/*
📂 设置工作目录: WORKDIR /app
📄 复制文件到容器: COPY . /app
📌 安装依赖: RUN npm install
🌐 暴露端口: EXPOSE 3000
🏃 设置启动命令: CMD ["node", "server.js"]
🐳 构建和运行 Docker 镜像
# 构建镜像docker build -t my-node-app .# 运行容器docker run -d -p 3000:3000 --name my-running-app my-node-app
🏗️ 构建镜像: docker build -t my-node-app .
, 默认运行这个目录的Dockerfile文件🚀 运行容器: 后台运行: docker run -d -p 3000:3000 --name my-running-app my-node-app
🎛️ 使用 Docker Compose
# docker-compose.yml 文件配置version: '3'services: web: # 使用镜像 image: my-node-app # 构建上下文 build: . # 端口映射 ports: - "3000:3000" # 挂载卷 volumes: - .:/app # 启动命令 command: node server.js
📜 docker-compose.yml
文件配置:
version: '3'
服务: 服务名 web
: 使用镜像: image: my-node-app
构建上下文: build: .
端口映射: ports: - "3000:3000"
挂载卷: volumes: - .:/app
启动命令: command: node server.js
📤 启动服务: docker-compose up -d
# 启动服务docker-compose up -d
⚠️ 注意:
确保 Node.js 应用的入口是server.js
。确保本地目录有 package.json
文件。在构建或运行之前检查 Docker 和 Docker Compose 是否已正确安装。