Docker buildx 安装

文章目录

    • 推荐
    • 简介
    • 开启实验室特性
    • 安装docker buildx
    • 安装模拟器
    • Build多平台image
    • 问题及解决方法
      • 问题一
      • 问题二
    • 参考链接

推荐

欢迎关注公众号9500后,围观技术、生活和日常。

简介

Docker buildx是docker的一个插件,它包含如下作用:

  1. 支持Moby BuildKit的所有特性;
  2. 可以跨CPU架构编译镜像;
  3. 可以在跨多节点同时编译镜像。

本文主要介绍其在Linux上的安装过程。

备注:在Windows和macOs上,Docker Desktop已经包含了Docker Buildx,无需额外安装,可通过命令docker buildx version 确认其是否安装成功。

开启实验室特性

  1. 首先查看是否已经开启实验室特性,如下图所示,如果都为true,说明Client和Server都已经开启完毕,跳过此小节即可。

Docker buildx 安装_第1张图片

  1. docker客户端开启实验室特性。在客户端的配置文件~/.docker/config.json中加入如下配置项,如果~/.docker/config.json文件不存在,则创建该文件。

    $ cat ~/.docker/config.json
    {
    	"experimental": "enabled"
    }
    
    # 确认实验室性能开启。
    $ docker version
    
  2. docker服务端开启实验室特性。在配置文件/etc/docker/daemon.json中加入如下配置项即可,如果/etc/docker/daemon.json文件不存在,则创建该文件。

    cat /etc/docker/daemon.json
    {
    	"experimental": true
    }
    
    systemctl daemon-reload
    systemctl restart docker
    
    # 确认实验室性能开启。
    docker version
    

安装docker buildx

  1. 下载机器对应的二进制安装包docker buildx download;

  2. 将其拷贝至$HOME/.docker/cli-plugins

    mkdir -p ~/.docker/cli-plugins
    mv buildx-v0.8.2.linux-xxx ~/.docker/cli-plugins/docker-buildx
    chmod +x ~/.docker/cli-plugins/docker-buildx
    
  3. 如果想让其在系统级别可用,可将其拷贝至如下路径:

    • /usr/local/lib/docker/cli-plugins OR /usr/local/libexec/docker/cli-plugins

    • /usr/lib/docker/cli-plugins OR /usr/libexec/docker/cli-plugins

  4. 确认安装成功

    docker buildx version
    docker buildx ls
    

安装模拟器

安装模拟器的主要作用是让buildx支持跨CPU架构编译。

  1. 首先查看是否已经安装模拟器

    $ docker buildx ls 
    NAME/NODE     DRIVER/ENDPOINT   STATUS   PLATFORMS
    default       docker
      default     default           running   linux/amd64
    
    # 如果Platforms列只有一个本机架构,则需要继续执行下面步骤;如果已经包含了多种平台,且包含你想要的平台,则你无需再安装。
    
  2. 模拟器对饮的仓库名称是:tonistiigi/binfmt:latest ,如果你的环境能联网,最简单的方法是

    $ docker run --privileged --rm tonistiigi/binfmt --install all
    
    # 验证模拟器是否安装成功
    $ docker buildx ls 
    default       docker
      default     default    running   linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
    
    # 查看某个,检查aarch64是否安装成功
    $ cat /proc/sys/fs/binfmt_misc/qemu-aarch64
    enabled
    interpreter /usr/bin/qemu-aarch64
    flags: OCF
    offset 0
    magic 7f454c460201010000000000000000000200b7
    
  3. 如果你的环境不能联网,则需先在外网环境下载好镜像,导入内网之后,再安装:

    # 外网下载镜像,注意(如果你的内网环境机器是arm架构,就下载arm版本,如果你的内网环境机器是amd架构,就下载amd版本;这里我下载的是arm版本)
    $ docker pull tonistiigi/binfmt:latest@sha256:01882a96113f38b1928a5797c52f7eaa7e39acf6cc15ec541c6e8428f3c2347d
    # 导出镜像
    $ docker save -o tonistiigi_binfmt_arm64.tar f1d8c13be37e
    # 将导出的镜像上传至内网服务器
    $ scp tonistiigi_binfmt_arm64.tar xxxx:/xxx
    # 在内网机器执行如下命令,导入镜像
    $ docker load -i tonistiigi_binfmt_arm64.tar
    # 安装模拟器
    $ docker run --privileged --rm tonistiigi/binfmt --install all
    
    # 验证是否安装成功
    $ docker buildx ls 
    default       docker
      default     default    running   linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
    
    # 验证arm机器上的amd模拟器是否安装成功,则执行如下命令,输出结果包含enable即可
    $ cat /proc/sys/fs/binfmt_misc/qemu-x86_64
    enabled
    
    # 如果你是amd机器,需要验证arm模拟器是否安装成功,则执行如下命令,输出结果包含enable即可
    $ cat /proc/sys/fs/binfmt_misc/qemu-aarch64
    enabled
    

Build多平台image

命令如下:

# 创建builder
$ docker buildx create --use --name mybuilder

# build镜像
$ docker buildx build --platform linux/amd64,linux/arm64 --push -t repo/hello .

问题及解决方法

由于本人是在内网环境下安装执行buildx命令,因此,遇到一些问题。

问题一

描述:

$ docker buildx build --platform linux/amd64,linux/arm64 -t repo/hello . --push
[+] Building 10.0s (1/1) FINISHED
=> ERROR [internal] booting buildkit 10.0s
=> => pulling image moby/buildkit:buildx-stable-1 10.0s

> [internal] booting buildkit:

error: Error response from daemon: Get [https://registry-1.docker.io/v2/:](https://registry-1.docker.io/v2/:) dial tcp: lookup r

原因: Docker默认去https://registry-1.docker.io拉镜像,因为不能联网,所有连接错误。

解决方法: 外网下载镜像,再导入内网。

# 外网节点拉取镜像
$ docker pull moby/buildkit:buildx-stable-1@sha256:273b61ca4f538c120c8555b4e7c59e903bd5bdfc72d93439e75f46fcf1f4e135

# 外网节点导出镜像
$ docker save -o moby_buildkit_buildx-stable-x-arm64.tar 9b3c7392ac9e

# 内网节点导入镜像
$ docker load -i moby_buildkit_buildx-stable-x-arm64.tar 9b3c7392ac9e
$ docker tag 9b3c7392ac9e moby/buildkit:buildx-stable-1

问题二

描述:

error: failed to solve: a.b.c:5000/centos8_gcc11_download: failed to do request: Head "[https://a.b.c:5000/v2/centos8_gcc11_download/manifests/latest]": dial tcp: lookup a.b.c on 192.168.0.3:53: read udp 172.17.0.3:48437->192.168.0.3:53: i/o timeout

原因:

  1. 它默认去网址https请求元数据,但是自己搭建的仓库没提供https的服务;
  2. 机器不能解析a.b.c的IP地址。

针对原因一,解决方法如下

参考github issures 336,主要步骤如下:

  1. 创建buildkitd.toml文件,模板可参考buildkitd.toml.md

  2. 以上模板不需要的内容可去掉,添加如下内容:(注意http的值为true)

[registry."a.b.c:5000"]
  mirrors = ["a.b.c:5000"]
  http = true
  insecure = true
  1. 删除旧的builder,重新创建新的builder。
docker buildx rm mybuilder
docker buildx create --use --name newbuilder --config buildkitd.toml

针对原因二,解决方法如下:

参考github issues 191

  • 如果你的机器安装了DNS服务,请确保该服务可用,主要涉及文件 /etc/resolv.conf/etc/hosts
  • 如果未安装DNS服务,可能需要将Dockerfile中的域名a.b.c改为真实的IP地址即可。

参考链接

docker buildx安装

  • https://goodcommand.readthedocs.io/zh_CN/latest/command/docker_buildx.html
  • https://jite.eu/2019/10/3/multi-arch-docker/
  • https://community.arm.com/arm-community-blogs/b/tools-software-ides-blog/posts/getting-started-with-docker-for-arm-on-linux
  • https://docs.docker.com/buildx/working-with-buildx/

docker buildx 使用方法:

  • https://docs.docker.com/engine/reference/commandline/buildx_build/

你可能感兴趣的:(配置,docker,buildx,模拟器)