Skip to content

Docker多架构构建镜像

docker多架构构建镜像

  • what: docker多架构构建镜像
  • where: centos7 x86 arm64
  • when: 2022-2-14
  • who: JRT
  • why: 记录
  • how:

1.安装docker

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

2.安装docker-compose

curl -L "https://github.com/docker/compose/releases/download/1.28.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

3.安装常用依赖

yum install vim wget git curl lrzsz -y

4.开启实验特性

cat /etc/docker/daemon.json

{
    "registry-mirrors": [
    "https://mirror.baidubce.com",
    "https://docker.mirrors.ustc.edu.cn/"
    ],
    "experimental": true
}

重加载服务配置并重启docker

#重新加载服务的配置文件
systemctl daemon-reload
#重启docker
systemctl restart docker
#查看docker状态
systemctl status docker
#测试manifest是否开启
docker manifest
#查看docker是否开启experimental功能
docker version 或docker system info
[root@ecs-40a8 ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.16.12
 Git commit:        e91ed57
 Built:             Mon Dec 13 11:45:00 2021
 OS/Arch:           linux/arm64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.12
  Git commit:       459d0df
  Built:            Mon Dec 13 11:43:46 2021
  OS/Arch:          linux/arm64
  Experimental:     true
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

5.制作多架构镜像

以自己为例,dockerhub仓库为jrt101,现在想制作mrdoc:v4的多架构镜像

分别在x86和arm环境构建mrdoc:v4镜像,制作完后没问题,分别修改tag

docker tag b0e1fd31e99e jrt101/mrdoc-x86_64:v4
docker tag 978af99fd151 jrt101/mrdoc-arm64:v4

分别在两个环境分别将两个镜像上传至dockerhub仓库

docker login
docker push jrt101/mrdoc-x86_64:v4
docker push jrt101/mrdoc-arm64:v4

制作多架构镜像

# 创建一个新的manifest,指定多架构镜像的名称,和具体的不同架构的镜像名称  
[root@ecs-40a8 doc]# docker manifest create --insecure jrt101/mrdoc:v4 jrt101/mrdoc-x86_64:v4 jrt101/mrdoc-arm64:v4
Created manifest list docker.io/jrt101/mrdoc:v4
#annotate  加注释
# 声明不同架构镜像对应的操作系统和cpu架构类型,其中x86_64需要用amd64来指定 
[root@ecs-40a8 doc]# docker manifest annotate jrt101/mrdoc:v4 jrt101/mrdoc-x86_64:v4 --os linux --arch amd64
[root@ecs-40a8 doc]# docker manifest annotate jrt101/mrdoc:v4  jrt101/mrdoc-arm64:v4 --os linux --arch arm64
# 将manifest从本地推送到私用仓库中  没有大小  是一个软连接
[root@ecs-40a8 doc]# docker manifest push --insecure jrt101/mrdoc:v4
Pushed ref docker.io/jrt101/mrdoc@sha256:a6318505ea1b7882f212c5e1a55352347f57dca0e6dd1cc0c67c60948c1674a6 with digest: sha256:a6318505ea1b7882f212c5e1a55352347f57dca0e6dd1cc0c67c60948c1674a6
Pushed ref docker.io/jrt101/mrdoc@sha256:b068bbaf8a7d01ab20d77d8c3d9aa4b9f6b85ad8a189b2d1a0e0018906160b55 with digest: sha256:b068bbaf8a7d01ab20d77d8c3d9aa4b9f6b85ad8a189b2d1a0e0018906160b55
sha256:c3f9aa7e18f980133a42cb8880232d9df5bce1e5cc0ffd618c3e347d0f7b8442
[root@ecs-40a8 doc]# echo $?
0
[root@ecs-40a8 doc]#