🐳 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
:- 🎯 目的: 缓存依赖管理工具(如 npm、go mod 等)所获取的依赖,提高构建效率。
- 🎬 示例: 你正在构建一个前端应用,每次构建都需要从 npm 仓库下载大量的依赖。使用这个指令,你可以缓存这些依赖,减少重复的下载时间。
# 使用实验性的 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
:- 🎯 目的: 将敏感信息(如密钥)安全地挂载到构建上下文中。
- 🎬 示例: 当你需要在构建过程中访问 AWS 的凭据,而不希望这些凭据包含在最终的镜像中,你可以使用这个指令。
# 使用实验性的 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
:- 🎯 目的: 挂载 SSH 密钥,使构建过程能够安全地访问私有仓库或其他需要 SSH 认证的资源。
- 🎬 示例: 当你的应用依赖于一个私有的 Git 仓库,你可以使用这个指令在构建过程中安全地克隆该仓库。
# 使用实验性的 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 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
🌟 3. 在不同的架构上运行镜像
你可以在不同的硬件架构上运行你的镜像,以验证它是否正确工作:
$ docker run -it --rm myusername/hello
🌟 4. 使用架构相关的变量
Dockerfile 支持一系列与架构相关的变量,例如 TARGETPLATFORM
, TARGETOS
, TARGETARCH
等。利用这些变量,你可以为不同的平台定制你的 Dockerfile。
例如,如果你已经为两个不同的平台生成了二进制文件,你可以这样使用这些变量:
FROM scratch
ARG TARGETOS
ARG TARGETARCH
COPY bin/dist-${TARGETOS}-${TARGETARCH} /dist
ENTRYPOINT ["dist"]
📝 创建 Docker 镜像步骤
🔧 Dockerfile 示例
# 使用 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"]
- 🛠️ 使用 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
文章来源:https://www.toymoban.com/news/detail-768934.html
# 启动服务
docker-compose up -d
⚠️ 注意:文章来源地址https://www.toymoban.com/news/detail-768934.html
- 确保 Node.js 应用的入口是
server.js
。 - 确保本地目录有
package.json
文件。 - 在构建或运行之前检查 Docker 和 Docker Compose 是否已正确安装。
到了这里,关于Docker - Docker Buildx的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!