Docker - Docker Buildx

这篇具有很好参考价值的文章主要介绍了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 buildx,Docker,docker,容器,运维


🚫 注意事项:

如果你使用的是云服务商(如腾讯云容器服务、阿里云容器服务等)提供的镜像构建服务,请注意,由于他们使用的 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 镜像步骤

docker buildx,Docker,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

⚠️ 注意:文章来源地址https://www.toymoban.com/news/detail-768934.html

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

到了这里,关于Docker - Docker Buildx的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Docker 镜像 (Harbor/BuildKit/buildx)

    golang 1.2.1. 基于 docker 容器 Commit 命令打包 第一步: 拉项目镜像 第二步: 基于镜像生成 docker(红色背景是项目的端口映射, 数据卷挂载, 定制化自启动和 root 登录权限), 这里按照自己的项目需求来: 第三步: 进入 docker, 添加或修改 docker(这里看需求修改: 我个人添加表 sql, 备份文件

    2024年02月04日
    浏览(11)
  • K8S:K8S自动化运维容器Docker集群

    K8S:K8S自动化运维容器Docker集群

    (1)K8S全程为Kubernetes,由于K到S直接有8个字母简称为K8S。 (2)版本:目前一般是1.18~1.2.0,后续可能会到1.24-1.26,1.24版本后丢弃了docker(如需要使用需要第三方插件配合),目前最新版本是1.27 (3)官网:https://kubernetes.io GitHub:GitHub - kubernetes/kubernetes: Production-Grade Container S

    2024年02月10日
    浏览(14)
  • K8S:K8S自动化运维容器化(Docker)集群程序

    K8S:K8S自动化运维容器化(Docker)集群程序

    目录 一、K8S概述 1、什么是K8S 2、为什么要用K8S 3、作用及功能 二、K8S的特性 1、弹性伸缩 2、自我修复 3、服务发现和复制均衡 5、自动发布和回滚 6、集中化配置管理和秘钥管理 7、存储编排 8、任务批量处理运行 三、K8S的集群架构 四、K8S的核心组件 1、Master组件 ①Kube-apis

    2024年02月12日
    浏览(16)
  • 小白到运维工程师自学之路 第六十二集 (docker持久化与数据卷容器)

    小白到运维工程师自学之路 第六十二集 (docker持久化与数据卷容器)

    一、概述 Docker持久化是指将容器中的数据持久保存在主机上,以便在容器重新启动或迁移时不丢失数据。由于Docker容器是临时和可变的,它们的文件系统默认是易失的,这意味着容器中的任何更改或创建的文件都只存在于此容器的生命周期内。但是,在许多场景中,我们希望

    2024年02月14日
    浏览(7)
  • Docker镜像文件打包和启动简易教程-Buildx构建多平台镜像

    在目标文件夹下执行以下命令 生成Dockerfile文件后,在其中写入 将本地Python项目打包成docker镜像,并在docker中运行 - 灰信网(软件开发博客聚合) 创建docker, . 必不可少 保存打包的镜像文件 命令行启动镜像文件 compase启动镜像文件 首先写入一个 docker_name.yaml 文件 docker compos

    2024年02月10日
    浏览(12)
  • docker使用buildx构建多平台(x86,arm64)构架镜像

    docker目前使用版本为Server Version: 20.10.7,添加配置支持buildx docker版本较低时,请升级docker版本 有部分docker未带有,比如arm版本,则需要单独下载文件: 重启docker 系统环境要求 如果版本较低,需要升级内核 安装binfmt,支持的平台 安装编译时需要支持的平台,这里选择所有 bin

    2024年02月02日
    浏览(12)
  • Gitlab 使用 docker buildx 多重构建镜像上传私有 Harbor与 Dockerhub

    Gitlab 使用 docker buildx 多重构建镜像上传私有 Harbor与 Dockerhub

    三台虚拟机 192.168.10.2 harbor 仓库 192.168.10.3 gitlab-ce 192.168.10.4 gitlab-runner 192.168.10.5 开发平台 系统: CentOS Linux release 8.5.2111 CPU: 4c 内存:8G 磁盘:40G 2.1 安装 docker buidx buidx在 gitlab runner 节点安装 默认的 docker build 命令无法完成跨平台构建任务,我们需要为 docker 命令行安装 bu

    2024年02月17日
    浏览(15)
  • 功能解释:containerd.io、docker-ce、docker-ce-cli、docker-buildx-plugin、docker-compose-plugin、docker.io

    功能解释:containerd.io、docker-ce、docker-ce-cli、docker-buildx-plugin、docker-compose-plugin、docker.io

    docker里面的组件插件还挺多的,有时候一个组件的功能还不太好从名字辨别,容易把人搞晕😵。 下面简单介绍一下docker相关术语,以及各部分组件的功能。 Docker有两个主要版本:Docker桌面版和Docker引擎(非桌面版)。 1. Docker桌面版 Docker桌面版是适用于桌面操作系统的完整

    2024年02月04日
    浏览(8)
  • 关于Deepin安装docker时遇到E: 无法定位软件包 docker-buildx-plugin 以及 E: 无法定位软件包 docker-compose-plugin 的解决办法

    关于Deepin安装docker时遇到E: 无法定位软件包 docker-buildx-plugin 以及 E: 无法定位软件包 docker-compose-plugin 的解决办法

    操作系统:Deepin20.9 使用电脑:Dell G15 按照https://docs.docker.com/engine/install/debian/的教程,正在完成如图所示操作时 报以下错误   我们知道我们是按照Debian10去安装Docker的, 此时我的soucelist如图所示: souecelist文件路径:/etc/apt/  在更新apt-get的 过程中,发现   debian有名叫apric

    2024年02月16日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包