9. 容器镜像架构差异 docker image¶
大多数时候,使用docker是没有差异的, 但是如果image不支持multi-arch [1] ,docker run会出错
这里以Kubernetes官方的小集群工具minikube介绍的echoserver [2] 为例。
在X86上运行,可以正常启动
user1@intel6248:~$ docker run --rm --name echoserver -p 8080:80 -p 1443:443 k8s.gcr.io/echoserver:1.4
user1@intel6248:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
099015e52159 k8s.gcr.io/echoserver:1.4 "nginx -g 'daemon of…" 7 minutes ago Up 7 minutes 443/tcp, 0.0.0.0:11080->80/tcp
在ARM上运行,会出错
user1@Arm64-server:~$ docker run --rm --name echoserver -p 8080:80 -p 1443:443 k8s.gcr.io/echoserver:1.4
standard_init_linux.go:211: exec user process caused "exec format error"
可以查看拉到本地的镜像, 当前只支持ARM64
user1@Arm64-server:~$ docker image inspect k8s.gcr.io/echoserver:1.4 | grep Architecture
"Architecture": "amd64",
9.1. 如果镜像不支持ARM64怎么办?¶
首先找到echoserver的Dockerfile [3]
根据kubernetes中镜像的构建指导 [4]
make all WHAT=agnhost
make all WHAT=echoserver
可以生成echoserver的多架构镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
gcr.io/kubernetes-e2e-test-images/echoserver 2.3-linux-ppc64le 5fb747e030a1 10 hours ago 27.3MB
gcr.io/kubernetes-e2e-test-images/echoserver 2.3-linux-arm64 26c05e1e91ff 10 hours ago 22MB
gcr.io/kubernetes-e2e-test-images/echoserver 2.3-linux-arm d68f0795cc5d 10 hours ago 19.7MB
gcr.io/kubernetes-e2e-test-images/echoserver 2.3-linux-amd64 c797d5221613 15 hours ago 19.3MB
这个时候的镜像是基于ARM64的
user1@intel6248:~/kubernetes/test/images$ docker inspect gcr.io/kubernetes-e2e-test-images/echoserver:2.3-linux-arm64 | grep Arch
"Architecture": "arm64",
| [1] | https://docs.docker.com/docker-for-mac/multi-arch/ |
| [2] | https://minikube.sigs.k8s.io/docs/start/ |
| [3] | https://github.com/kubernetes/kubernetes/blob/master/test/images/echoserver/Dockerfile |
| [4] | https://github.com/kubernetes/kubernetes/tree/master/test/images |