docker构建多平台镜像

场景:当我打包本地项目为docker镜像时,因为本地电脑是m1 mac mini,默认打包出来的镜像是linux/arm64,而远程服务器需要使用linux/amd64镜像,所以需要本地电脑能打包出linux/amd64镜像

以下内容有GPT-4o辅助编写

默认你电脑已安装docker,如果没安装,请参考docker学习

安装 Docker Buildx

docker buildx是 Docker CLI 的一个插件,如果使用的是 Docker 19.03 或更高版本,它会默认安装和启用。可以通过以下命令检查你的 Docker 版本和 Buildx 是否已经启用:

1
2
docker version
docker buildx version

如果 Buildx 没有启用,可以通过以下步骤安装并启用:

下载并安装 Buildx 插件(适用于未默认安装的 Docker 版本):

  • 在 Linux 上:
    1
    2
    3
    mkdir -p ~/.docker/cli-plugins
    curl -SL https://github.com/docker/buildx/releases/latest/download/docker-buildx-linux-amd64 -o ~/.docker/cli-plugins/docker-buildx
    chmod +x ~/.docker/cli-plugins/docker-buildx
  • 在 macOS 上(使用 Docker Desktop 的情况下):通过 Docker Desktop 安装管理插件即可。

创建和使用 Buildx Builder

创建一个新的 buildx 构建实例,并设置为默认实例:

1
docker buildx create --name mybuilder --use

激活后,可以通过以下命令查看当前的构建实例:

1
docker buildx inspect --bootstrap

构建多平台镜像

使用 docker buildx 构建多平台镜像需要指定目标平台。平台可以是 linux/amd64, linux/arm64 等。

下面是一个构建多平台镜像的示例步骤:

  1. 构建并推送多平台镜像到 Docker Hub:

假设你已经有一个 Dockerfile,使用以下命令构建并推送:

1
docker buildx build --platform linux/amd64,linux/arm64 -t yourusername/yourimage:tag --push .
  • --platform参数用于指定要构建的架构。
  • -t参数用于标记镜像。
  • --push参数在构建后自动将镜像推送到 Docker Hub 或指定的镜像仓库。
  1. 仅构建多平台镜像而不推送:
    如果只想在本地构建多平台镜像,而不立即推送,可以使用 –load 选项:
    1
    docker buildx build --platform linux/amd64,linux/arm64 -t yourusername/yourimage:tag --load .
    注意:–load 选项只支持单个平台加载。如果需要多个平台,建议使用 –push

实践:打包指定平台镜像,并推送到个人阿里镜像库

申请免费个人仓库:阿里云容器镜像服务

  1. 在本地Dockerfile下执行打包命令
    镜像名为myapp,版本为0.0.1,–load表示将构建的镜像加载到本地,不推送到远程仓库

    1
    docker buildx build --platform linux/amd64 -t myapp:0.0.1 --load .    
  2. docker login登录阿里云个人仓库账号
    输入平台账号密码即可

  3. 标记本地镜像
    registry.cn-hangzhou.aliyuncs.com/zxp_learn为我的阿里云个人镜像仓库

    1
    docker tag myapp:0.0.1 registry.cn-hangzhou.aliyuncs.com/zxp_learn/myapp:0.0.1
  4. 推送镜像到仓库

    1
    docker push registry.cn-hangzhou.aliyuncs.com/zxp_learn/myapp:0.0.1  
  5. 在需要使用的其他电脑/服务器拉取镜像

    1
    docker pull registry.cn-hangzhou.aliyuncs.com/zxp_learn/myapp:0.0.1