docker buildx跨架构构建笔记(x86_64构建下构建aarch64镜像)

docker buildx跨架构构建(x86_64构建aarch64镜像)

简介

Docker Buildx 是 Docker 团队为 Docker 引擎设计的一个工具,用于支持构建和管理多平台的容器镜像。它扩展了 Docker 构建工具,使得可以跨多个不同的架构和操作系统进行构建。

第一步 先交叉编译一个aarch64的HelloWorld程序。

在这里插入图片描述

准备一个用于跨架构的Dockerfile文件

vi Dockerfile

FROM ubuntu:20.04

COPY main  /app/main

WORKDIR /app

CMD ["/app/main"]

使用docker buildx命令构建aarch64架构的镜像。

docker buildx build --platform linux/arm64 -t test:0.1 --load .

# root @ liuyuelong-System-Product-Name in ~/workspace/cross_test/src/main on git:master x [17:28:46] 
$ docker buildx build --platform linux/arm64 -t aarch64_images:1.0 --load .
[+] Building 3.4s (9/9) FINISHED                                                                                docker-container:elegant_davinci
 => [internal] load build definition from Dockerfile                                                                                        0.0s
 => => transferring dockerfile: 111B                                                                                                        0.0s
 => [internal] load .dockerignore                                                                                                           0.0s
 => => transferring context: 2B                                                                                                             0.0s
 => [internal] load metadata for docker.io/library/ubuntu:20.04                                                                             2.8s
 => [internal] load build context                                                                                                           0.0s
 => => transferring context: 14.27kB                                                                                                        0.0s
 => CACHED [1/3] FROM docker.io/library/ubuntu:20.04@sha256:ed4a42283d9943135ed87d4ee34e542f7f5ad9ecf2f244870e23122f703f91c2                0.0s
 => => resolve docker.io/library/ubuntu:20.04@sha256:ed4a42283d9943135ed87d4ee34e542f7f5ad9ecf2f244870e23122f703f91c2                       0.0s
 => [2/3] COPY main  /app/main                                                                                                              0.0s
 => [3/3] WORKDIR /app                                                                                                                      0.0s
 => exporting to oci image format                                                                                                           0.3s
 => => exporting layers                                                                                                                     0.2s
 => => exporting manifest sha256:9354e37bfcc69a2408f10323d76afaa40e96fb04f5ef6260d23ca6f17ec86dad                                           0.0s
 => => exporting config sha256:a858b4c183e0ebdc2e8b217c5557e1f3fb3aebc3df98a0f8cfd5b68673005052                                             0.0s
 => => sending tarball                                                                                                                      0.1s
 => importing to docker                                                                                                                     0.0s

# root @ liuyuelong-System-Product-Name in ~/workspace/cross_test/src/main on git:master x [17:31:22] 
$ docker images | grep aarch64_images
aarch64_images                                    1.0               a858b4c183e0   43 seconds ago      65.7MB

查看镜像具体详细信息(确定镜像是ARM架构)

# root @ liuyuelong-System-Product-Name in ~/workspace/cross_test/src/main on git:master x [17:32:10] 
$ docker inspect aarch64_images:1.0
[
    {
        "Id": "sha256:a858b4c183e0ebdc2e8b217c5557e1f3fb3aebc3df98a0f8cfd5b68673005052",
        "RepoTags": [
            "aarch64_images:1.0"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2023-11-30T09:31:22.44138137Z",
        "Container": "",
        "ContainerConfig": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": null,
            "Cmd": null,
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "DockerVersion": "",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/app/main"
            ],
            "ArgsEscaped": true,
            "Image": "",
            "Volumes": null,
            "WorkingDir": "/app",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.opencontainers.image.ref.name": "ubuntu",
                "org.opencontainers.image.version": "20.04"
            }
        },
        "Architecture": "arm64",
        "Os": "linux",
        "Size": 65692279,
        "VirtualSize": 65692279,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/31cdebbee3d9a5cb5222804c1ca5759ce9d9dacc1aa94c9ff5317fe13989aca1/diff",
                "MergedDir": "/var/lib/docker/overlay2/6c1bad2064ca4947f86e3a9438c25e7c926cb7d4d65c3cececcd0ce7236ec3cc/merged",
                "UpperDir": "/var/lib/docker/overlay2/6c1bad2064ca4947f86e3a9438c25e7c926cb7d4d65c3cececcd0ce7236ec3cc/diff",
                "WorkDir": "/var/lib/docker/overlay2/6c1bad2064ca4947f86e3a9438c25e7c926cb7d4d65c3cececcd0ce7236ec3cc/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:701ccb11c0525a289459678e1ef3e9269b62737fafb033db91061ae53a0e9c1e",
                "sha256:2ebde9a9a90f240d14d223cb6d6ac61e209f0e871973ceb6c421b3b0569c09d8"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

"Architecture": "arm64", 架构没有问题

测试(通过)

导出镜像
docker save aarch64_images:1.0 -o aarch64_images.img
在aarch64架构下安装镜像
docker load -i aarch64_images.img
运行测试

# docker run --rm aarch64_images:1.0
Hello World!

测试通过

小技巧(避免每次下载aarch64架构的基础镜像)

docker buildx create --use
create => Create a new builder instance 创建一个新的构造器实例
–use => Set the current builder instance 使用创建的构建器实例作为当前的构造器

创建实例后,如果使用的话,构造器就会被激活,并以容器的形式运行,在这个容器中,在构建过程中下载的基础镜像会被保存在容器中,再次构建,不需要重新下载基础镜像。

也可以使用命令管理构造器
在这里插入图片描述

跨架构执行容器

正常情况下,我们无法再x86_64下执行aarch64的程序的,比如在DockerFile文件中项执行apt update。

需要有arrch64的模拟器。

查看当前支持的模拟器

# root @ lyl-192-168-129-72-ubuntu20-04 in ~/workspace/VideoGateway-v2.0.0/Node_v2.0.0/release/native/latest/lib on git:2.0.0 o [15:14:05] 
$ docker buildx ls         
NAME/NODE         DRIVER/ENDPOINT             STATUS   BUILDKIT             PLATFORMS
exciting_hertz *  docker-container                                          
  exciting_hertz0 unix:///var/run/docker.sock inactive                      
default           docker                                                    
  default         default                     running  v0.11.7+d3e6c1360f6e linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v

如果没有,可以通过一下命令安装

docker run --rm --privileged tonistiigi/binfmt:latest --install all

具体可拜读:https://zhuanlan.zhihu.com/p/438463289

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Docker Compose 是一个用于定义和运行 Docker 容器化应用程序的工具,它允许用户使用简单的 YAML 文件来描述多个容器之间的关系和依赖关系。而 "docker-compose-linux-x86_64.64" 镜像Docker Compose 在 Linux x86_64 架构上的镜像。下面将对它进行详细说明: 1. 架构:这个镜像构建在 Linux x86_64 架构上的,也就是说它适用于运行在基于 Intel 或 AMD 的 64 位处理器上的操作系统。 2. 功能:docker-compose-linux-x86_64.64 镜像是一个可执行文件,其中包含了 Docker Compose 的所有功能。它允许用户通过命令行界面或者编写的 YAML 文件来管理和组织多个 Docker 容器的运行。 3. 安装:要使用这个镜像,你需要先安装 Docker 引擎,因为 Docker Compose 依赖于 Docker 引擎来创建和管理容器。在安装 Docker 引擎后,你可以从 Docker 官方仓库中拉取 docker-compose-linux-x86_64.64 镜像,然后将它保存到你的系统中。 4. 使用:一旦你成功安装了 Docker 引擎和 docker-compose-linux-x86_64.64 镜像,你就可以使用 "docker-compose" 命令来管理 Docker 容器了。你可以在命令行中直接运行它,也可以将所需的 Docker Compose 命令以脚本的形式写在 YAML 文件中并执行。 总结来说,docker-compose-linux-x86_64.64 镜像是一个专门用于 Linux x86_64 架构上的 Docker Compose 工具。它允许用户以便捷的方式定义和管理多个 Docker 容器的关系和依赖,并且提供了命令行和 YAML 文件两种使用方式。使用这个镜像,你可以更加高效地部署和运行基于容器化的应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值