Docker - Docker Buildx


🐳 Docker Buildx

Docker Buildx 是 Docker 的新成员,它为 Docker 构建功能带来了全新的体验。让我们来深入了解它的魔法。


🔍 什么是 Docker Buildx?

Docker Buildx 是 Docker CLI 的一个插件,它为 Docker 构建提供了全新的功能。它不仅保留了标准 docker build 的所有功能,还加入了一些强大的新功能。


🌟 主要特点:

  1. 多平台构建:

    • 你可以在单个命令中为多个平台构建Docker镜像。
    • 🎬 示例: 想象一下,你正在制作一个应用程序,并想让它在 Windows、Linux 和 ARM 架构上都能运行。使用 Buildx,你可以同时为所有这些平台构建镜像,而不需要单独为每个平台构建。
  2. 构建缓存:

    • Buildx 支持高级构建缓存,使得构建过程更快。
    • 🎬 示例: 这就像一个智能的咖啡机,它记得你上次的选择并提前为你准备好,这样你每次都可以更快地得到你的咖啡。
  3. 并行构建:

    • 你可以同时构建多个镜像。
    • 🎬 示例: 就像你有多个炉子一样,你可以在每个炉子上烹饪不同的食物,而不是等待一个食物烹饪完再开始另一个。

📌 兼容性:

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 后,我们可以使用以下新指令来优化和加速镜像构建:

  1. 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"]
    
    
    
  2. 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
    
    
  3. 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
    
    
  4. 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
    
    
  5. 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

# 启动服务
docker-compose up -d

⚠️ 注意:

  • 确保 Node.js 应用的入口是 server.js
  • 确保本地目录有 package.json 文件。
  • 在构建或运行之前检查 Docker 和 Docker Compose 是否已正确安装。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yueerba126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值