引子
最近发现有ARM版Docker,hub.docker.com上也有ARM版本的镜像,但是ARM版本的Docker镜像构建是个问题。嵌入式程序可以在PC机上进行交叉编译,不知道Docker是否有交叉构建的方案。
方案
目前想到的Docker构建ARM镜像方法有如下几种。第三种就类似交叉编译。
使用ARM主机,安装ARM版本的Docker,docker build出来的就是ARM版本的镜像。
使用Linux的虚拟化软件,模拟ARM芯片+ Linux,例如qemu。
使用Docker试验功能buildx,可以构建多平台的镜像。
使用Docker buildx构建多个平台镜像
参考如下几个链接。
https://docs.docker.com/engine/reference/commandline/manifest/
https://docs.docker.com/buildx/working-with-buildx/
https://engineering.docker.com/2019/06/getting-started-with-docker-for-arm-on-linux/
用到了两个docker的试验功能,使用时需要开启试验功能。
docker manifest,manifest是一个包含了镜像信息的文件。manifest list是一个镜像清单列表,用于存放不同os/arch的镜像信息。我们可以创建一个manifest list来指向两个镜像,然后可以支持多平台。
docker buildx,buildx是docker的一个插件,是下一代docker镜像构建。该插件通过qemu-user-static翻译不同平台的指令集,达到在x64上运行其他平台的程序。buildx实际使用了moby/buildkit:buildx-stable-1镜像进行多平台构建。
搭建docker registry多平台版本
参考如下链接,构建docker registry镜像。
https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/deploying-multi-architecture-docker-registry
搭建dns服务器,解决buildx bug
buildx插件不走本地hosts文件,必须走dns。这是个bug,https://github.com/docker/buildx/issues/218,社区也没人管。
解决方法:自建dns,把镜像的地址buildx.com指向registry的机器,后续用nginx。ubuntu有一个默认systemd-resolved,关闭之后在开启dnsmasq。
使用nginx代理解决命名问题
增加nginx代理同时支持HTTP和HTTPS。buildx这个插件强行使用了HTTPS,没有找到关闭的地方。
提示证书问题,证书不是这个域名的,解决方法: 重新生成一个证书,域名填自己的。
证书问题,不信任自签名证书,把自签名的证书加到buildx daemon容器的证书信任链中。https://github.com/docker/buildx/issues/80#issuecomment-533844117
nginx增加两个配置,解决客户端push时的几个问题。
# nignx.conf 配置
proxy_ignore_client_abort on; #忽略客户端告警
client_max_body_size 0; #上传文件大小不限制# 虚拟主机配置
server {
listen 443;
server_name buildx.com;
ssl on;
ssl_certificate crt/server.crt;










