最近發現有ARM版Docker,hub.docker.com上也有ARM版本的鏡像,可是ARM版本的Docker鏡像構建是個問題。嵌入式程序能夠在PC機上進行交叉編譯,不知道Docker是否有交叉構建的方案。java
目前想到的Docker構建ARM鏡像方法有以下幾種。第三種就相似交叉編譯。linux
參考以下幾個連接。
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鏡像進行多平臺構建。nginx
參考以下連接,構建docker registry鏡像。
https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/deploying-multi-architecture-docker-registrygit
buildx插件不走本地hosts文件,必須走dns。這是個bug,https://github.com/docker/buildx/issues/218,社區也沒人管。
解決方法:自建dns,把鏡像的地址buildx.com指向registry的機器,後續用nginx。ubuntu有一個默認systemd-resolved,關閉以後在開啓dnsmasq。github
增長nginx代理同時支持HTTP和HTTPS。buildx這個插件強行使用了HTTPS,沒有找到關閉的地方。
提示證書問題,證書不是這個域名的,解決方法: 從新生成一個證書,域名填本身的。
證書問題,不信任自簽名證書,把自簽名的證書加到buildx daemon容器的證書信任鏈中。https://github.com/docker/bui...
nginx增長兩個配置,解決客戶端push時的幾個問題。docker
# 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; ssl_certificate_key crt/server.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照這個協議配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照這個套件配置 ssl_prefer_server_ciphers on; location / { proxy_pass http://192.168.1.11:81; } } server { listen 80; server_name buildx.com; location / { proxy_pass http://192.168.1.11:81; } }
本地Docker須要開啓實驗功能。json
# 拉取arm64版本鏡像並運行 docker pull --platform arm64 alpine:3.10 docker run --rm -it alpine:3.10 sh
能夠從hub.docker.com中獲取多個平臺的版本,生成manifest list,上傳的registry中。ubuntu
# pull arm64版本、更名、上傳。 具體鏡像是否支持多平臺,能夠到hub.docker.com上看。 docker pull --platform arm64 centos:7 docker tag centos:7 buildx.com/base/centos-arm64:7 docker push buildx.com/base/centos-arm64:7 # pull amd64版本、更名、上傳 docker pull --platform amd64 centos:7 docker tag centos:7 buildx.com/base/centos-amd64:7 docker push buildx.com/base/centos-amd64:7 # 建立manifest list、上傳。 docker manifest create --insecure buildx.com/base/centos:7 buildx.com/base/centos-amd64:7 buildx.com/base/centos-arm64:7 docker manifest push --insecure buildx.com/base/centos:7
# buildx 能夠指定多個平臺,可是要求Dockerfile中的FROM鏡像必須有對應版本的。 # buildx 打包的鏡像不會在本地存儲,加--push,上傳docker倉。或者可使用--output指定輸出方式。 docker buildx build --platform linux/amd64,linux/arm64 -t buildx.com/base/java-base:openjdk-8-centos7 . --push