Docker Buildx 是 Docker 的新成员,它为 Docker 构建功能带来了全新的体验。让我们来深入了解它的魔法。
Docker Buildx 是 Docker CLI 的一个插件,它为 Docker 构建提供了全新的功能。它不仅保留了标准 docker build
的所有功能,还加入了一些强大的新功能。
多平台构建:
构建缓存:
并行构建:
Docker Buildx 功能仅适用于 Docker v19.03+ 版本。如果你使用的是更早的版本,你需要升级你的 Docker 以使用这个强大的功能。
由于 Buildx 是 Docker CLI 的一个插件,你可能需要单独安装它。一旦安装完成,你就可以使用 docker buildx
命令开始你的多平台构建之旅了!
BuildKit 是 Docker 的下一代构建工具,专为现代容器和微服务工作负载设计,它在 GitHub 上开源。
如果你使用的是云服务商(如腾讯云容器服务、阿里云容器服务等)提供的镜像构建服务,请注意,由于他们使用的 Docker 版本可能低于 18.09,所以 BuildKit 无法使用,可能会导致构建失败。建议在使用 BuildKit 时创建一个新的 Dockerfile(例如 Dockerfile.buildkit
)。
Docker Hub 的自动构建已经支持 buildkit,具体可以参考 这里。
启用 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 [email protected]:yourusername/private-repo.git
为了在 docker-compose 构建中使用 BuildKit,你只需要设置 COMPOSE_DOCKER_CLI_BUILD=1
这个环境变量。
更多关于 BuildKit 和它的实验性特性的详细信息,可以在官方文档中找到。
Docker Buildx 是 Docker CLI 的一个扩展插件,提供了与传统的 docker build
类似的用户体验,但增加了一些新的功能和优化。
要使用 docker buildx
构建镜像,你可以直接执行以下命令:
$ docker buildx build .
在执行上述命令时,你会看到构建的进度输出,例如:
[+] Building 8.4s (23/32)
=> ...
docker build
不同,buildx
允许你为多个平台构建镜像,而无需切换 Docker 上下文。Buildx 支持许多 BuildKit 的新功能,例如缓存控制、并行构建等。要了解更多关于这些特性的信息,你可以参考 BuildKit 的相关文档。
有关 docker buildx
的更多详细信息和使用方法,可以访问 Docker 的官方文档。
Docker Buildx 提供了一个简单而高效的方法,允许开发者在单次构建中为多种架构构建 Docker 镜像。下面是如何使用 Buildx 构建多种系统架构支持的 Docker 镜像的步骤。
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
首先,你需要一个 Dockerfile。例如:
FROM --platform=$TARGETPLATFORM alpine
RUN uname -a > /os.txt
CMD cat /os.txt
接下来,使用 docker buildx build
命令来构建支持多种架构的镜像:
$ docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t myusername/hello . --push
你可以在不同的硬件架构上运行你的镜像,以验证它是否正确工作:
$ docker run -it --rm myusername/hello
Dockerfile 支持一系列与架构相关的变量,例如 TARGETPLATFORM
, TARGETOS
, TARGETARCH
等。利用这些变量,你可以为不同的平台定制你的 Dockerfile。
例如,如果你已经为两个不同的平台生成了二进制文件,你可以这样使用这些变量:
FROM scratch
ARG TARGETOS
ARG TARGETARCH
COPY bin/dist-${TARGETOS}-${TARGETARCH} /dist
ENTRYPOINT ["dist"]
# 使用 Ubuntu 基础镜像
FROM ubuntu:20.04
# 设置非交互式前端
ENV DEBIAN_FRONTEND=noninteractive
# 安装 Node.js 和 npm
RUN 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"]
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
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 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.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
⚠️ 注意:
server.js
。package.json
文件。