您现在的位置是:首页 > 短信大全

Docker - Docker Buildx

作者:淼淼时间:2024-04-14 10:49:29分类:短信大全

简介  文章浏览阅读1.7k次。Docker Buildx 是 Docker CLI 的一个插件,它为 Docker 构建提供了全新的功能。它不仅保留了标准。_docker buildx

点击全文阅读


🐳 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 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 是否已正确安装。

点击全文阅读

郑重声明:

本站所有活动均为互联网所得,如有侵权请联系本站删除处理

我来说两句