原文链接:https://www.baeldung.com/ops/docker-buildx
一、简介
Docker 是一种流行的部署工具,使我们能够打包和运行应用程序。由于采用率很高,因此需要根据不同的要求扩展功能。因此,为了实现这一点,可以使用第三方docker 插件[1]。
例如,如果希望数据跨不同主机持久化数据,可以使用卷插件。另一个常用的插件是 Docker buildx[2] 。它通过使用 BuildKit builder 扩展了镜像的构建能力。因此,使用该插件,我们可以为不同的平台和架构构建镜像。此外,它支持使用自定义上下文进行并行多阶段制作。
在本教程中,我们将介绍 Docker buildx。
2.安装 buildx
首先,要运行 buildx ,我们需要安装 Docker。对 Docker buildx 的支持从 19.00 开始可用。
首先检查 Docker 版本:
$ docker --version
Docker version 19.03.8, build afacb8b
接下来,通过设置环境变量启用 Docker 实验性功能:
$ export DOCKER_CLI_EXPERIMENTAL=enabled
为了确保我们的设置在会话结束后仍然存在,我们将变量添加到$HOME/.bashrc
,现在应该可以访问 buildx:
$ docker buildx
Usage: docker buildx COMMAND
Build with BuildKit
Management Commands:
imagetools Commands to work on images in registry
Commands:
bake Build from a file
build Start a build
create Create a new builder instance
inspect Inspect current builder instance
ls List builder instances
rm Remove a builder instance
stop Stop builder instance
use Set the current builder instance
version Show buildx version information
Run 'docker buildx COMMAND --help' for more information on a command.
这显示了常用命令和每个命令的语法。
3.使用 buildx 构建
buildx 执行所有Docker 构建[3]功能。因此,可以轻松地运行并执行它们。例如,指定目标平台、构建缓存和输出配置。除此之外, buildx 还提供了额外的功能。
首先是同时为多个平台构建镜像的能力。其次,在单个 dockerfile 中为较小的镜像进行多阶段构建。最后,在构建过程中自定义输入、参数或变量的能力。
让我们通过创建一个实例来深入研究一个例子:
$ docker buildx create --name ourbuilder
ourbuilder
这将创建一个名为 ourbuilder 的构建实例。
接下来,将其设置为活动目录:
$ docker buildx use ourbuilder
接下来,创建一个 dockerfile 来运行一个简单的 node 应用程序:
# Base image
FROM node:14-alpine
# Set working directory
WORKDIR /app
# Copy application files
COPY . .
# Install dependencies
RUN npm install --production
# Expose the port
EXPOSE 3000
# Start the application
CMD ["node", "app.js"]
这里使用 node.js 基础镜像并将工作目录设置为/app。然后将应用程序文件复制到容器中。然后安装所有依赖项,暴露端口 3000 并启动应用程序:
$ docker buildx build --platform linux/amd64,linux/arm64 -t ourapp:latest .
time="2023-06-01T07:13:20+03:00" level=warning msg="No output specified for docker-container driver.
Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load"
#1 [internal] booting buildkit
#1 pulling image moby/buildkit:buildx-stable-1
#1 pulling image moby/buildkit:buildx-stable-1 73.2s done
#1 creating container buildx_buildkit_ourbuilder0
#1 creating container buildx_buildkit_ourbuilder0 2.1s done
#1 DONE 75.4s
#3 [internal] load .dockerignore
#3 transferring context: 0.0s
#3 transferring context: 2B 0.1s done
#3 DONE 0.3s
#2 [internal] load build definition from Dockerfile
#2 transferring dockerfile: 294B 0.0s done
#2 DONE 0.4s
#4 [linux/amd64 internal] load metadata for docker.io/library/node:14-alpin...
#4 DONE 4.7s
.... truncated .....
使用 –platform
标志指定目标平台。在这种情况下,目标是 x86 (Linux/amd64) 和 ARM (Linux/arm64) 架构。我们还提供了标签-t ourapp:latest
以使用名称 ourapp 和 latest 标签来标记构建的镜像。指定构建上下文,即当前目录。
Docker buildx auto 处理多平台构建并为每个目标架构生成单独的镜像。
4、结论
在本教程中,我们探索了 Docker buildx,这是一种扩展 Docker 镜像构建和管理能力的工具。它通过支持并行构建、自定义构建上下文和多阶段构建来简化流程。
往期推荐
- 得物App全栈 DevOps 可观测平台落地实践
- 神器 Nginx 的学习手册 ( 建议收藏 )
- 19 个 K8S集群常见问题总结,建议收藏
- 9 个实用 Shell 脚本,建议收藏!
- K8S运维必知必会的 Kubectl 命令
- 史上最全 Jenkins Pipeline流水线详解
- 主流监控系统 Prometheus 学习指南
- 搭建一套完整的企业级 K8s 集群 (二进制方式)
- 40个 Nginx 常问面试题
- Linux运维工程师 50个常见面试题
点亮,服务器三年不宕机