前提条件
- 确保
Docker
版本不低于 19.03
,同时还要通过设置环境变量 DOCKER_CLI_EXPERIMENTAL
来启用。可以通过下面的命令来为当前终端启用 buildx
插件,并验证是否开启[1]:
1 2 3 4
| [root@node1 root]
[root@node1 root] github.com/docker/buildx v0.3.1-tp-docker 6db68d029599c6710a32aa7adcba8e5a344795a7
|
- 确保
Linux
内核版本升级到 4.8
以上,否则会出现如下异常[2]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| [root@node1 root] Unable to find image 'tonistiigi/binfmt:latest' locally latest: Pulling from tonistiigi/binfmt 2a625f6055a5: Pull complete 71d6c64c6702: Pull complete Digest: sha256:8de6f2decb92e9001d094534bf8a92880c175bd5dfb4a9d8579f26f09821cfa2 Status: Downloaded newer image for tonistiigi/binfmt:latest installing: arm64 cannot register "/usr/bin/qemu-aarch64" to /proc/sys/fs/binfmt_misc/register: write /proc/sys/fs/binfmt_misc/register: invalid argument installing: s390x cannot register "/usr/bin/qemu-s390x" to /proc/sys/fs/binfmt_misc/register: write /proc/sys/fs/binfmt_misc/register: invalid argument installing: riscv64 cannot register "/usr/bin/qemu-riscv64" to /proc/sys/fs/binfmt_misc/register: write /proc/sys/fs/binfmt_misc/register: invalid argument installing: mips64le cannot register "/usr/bin/qemu-mips64el" to /proc/sys/fs/binfmt_misc/register: write /proc/sys/fs/binfmt_misc/register: invalid argument installing: mips64 cannot register "/usr/bin/qemu-mips64" to /proc/sys/fs/binfmt_misc/register: write /proc/sys/fs/binfmt_misc/register: invalid argument installing: arm cannot register "/usr/bin/qemu-arm" to /proc/sys/fs/binfmt_misc/register: write /proc/sys/fs/binfmt_misc/register: invalid argument installing: ppc64le cannot register "/usr/bin/qemu-ppc64le" to /proc/sys/fs/binfmt_misc/register: write /proc/sys/fs/binfmt_misc/register: invalid argument { "supported": [ "linux/amd64", "linux/386" ], "emulators": null }
|
环境准备
- 升级内核版本,以升级到
4.9
为例,相关rpm
包见链接[3]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| [root@node1 4.9] total 13400 -rw-r--r-- 1 root root 1114112 Dec 12 20:22 kernel-4.9.241-37.el7.x86_64.rpm -rw-r--r-- 1 root root 11686072 Dec 12 20:22 kernel-devel-4.9.241-37.el7.x86_64.rpm
[root@node1 4.9] warning: kernel-4.9.241-37.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 61e8806c: NOKEY Preparing... Updating / installing... 1:kernel-devel-4.9.241-37.el7 2:kernel-4.9.241-37.el7
[root@node1 4.9]
[root@node1 4.9] Linux node1 4.9.241-37.el7.x86_64
|
- 启用
binfmt_misc
,并检查启用结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| [root@node1 ~]
installing: arm OK installing: s390x OK installing: ppc64le OK installing: arm64 OK installing: riscv64 OK installing: mips64le OK installing: mips64 OK { "supported": [ "linux/amd64", "linux/arm64", "linux/riscv64", "linux/ppc64le", "linux/s390x", "linux/386", "linux/mips64le", "linux/mips64", "linux/arm/v7", "linux/arm/v6" ], "emulators": [ "qemu-aarch64", "qemu-arm", "qemu-mips64", "qemu-mips64el", "qemu-ppc64le", "qemu-riscv64", "qemu-s390x" ] }
[root@node1 ~] total 0 drwxr-xr-x 2 root root 0 Dec 13 16:29 . dr-xr-xr-x 1 root root 0 Dec 13 16:27 .. -rw-r--r-- 1 root root 0 Dec 13 16:29 qemu-aarch64 -rw-r--r-- 1 root root 0 Dec 13 16:29 qemu-arm -rw-r--r-- 1 root root 0 Dec 13 16:29 qemu-mips64 -rw-r--r-- 1 root root 0 Dec 13 16:29 qemu-mips64el -rw-r--r-- 1 root root 0 Dec 13 16:29 qemu-ppc64le -rw-r--r-- 1 root root 0 Dec 13 16:29 qemu-riscv64 -rw-r--r-- 1 root root 0 Dec 13 16:29 qemu-s390x --w------- 1 root root 0 Dec 13 16:29 register -rw-r--r-- 1 root root 0 Dec 13 16:29 status
|
构建验证
创建一个新的构建器,并启动构建器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| [root@node1 ~] mybuilder
[root@node1 ~] [+] Building 105.8s (1/1) FINISHED => [internal] booting buildkit 105.8s => => pulling image moby/buildkit:buildx-stable-1 105.3s => => creating container buildx_buildkit_mybuilder0 0.6s Name: mybuilder Driver: docker-container Last Activity: 2023-12-13 08:35:03 +0000 UTC
Nodes: Name: mybuilder0 Endpoint: unix:///var/run/docker.sock Status: running Buildkit: v0.9.3 Platforms: linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
|
以构建xxx
镜像为例,并将构建好的镜像保存在本地,将 type
指定为 docker
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| [root@node1 images] [+] Building 5.5s (6/6) FINISHED docker-container:mybuilder => [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 219B 0.0s => [internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [internal] load build context 0.9s => => transferring context: 68.42MB 0.8s => [1/1] COPY ./xxx /bin/xxx 0.1s => exporting to oci image format 4.3s => => exporting layers 3.0s => => exporting manifest sha256:33877987488ccd8fb6803f06f6b90b5ff667dd172db23b339e96acee31af354f 0.0s => => exporting config sha256:f16ad6c6fc37b1cad030e7880c094f75f2cb6959ebbc3712808f25e04b96a395 0.0s => => sending tarball 1.3s => importing to docker
|
查看镜像:
1 2
| [root@node1 images] xxx/xxx latest f16ad6c6fc37 2 minutes ago 68.4MB
|
参考资料
https://cloud.tencent.com/developer/article/1543689
https://www.cnblogs.com/frankming/p/16870285.html
http://ftp.usf.edu/pub/centos/7/virt/x86_64/xen-414/Packages/k/