因為公司一個項目甲方是國企挣饥,要用arm64架構(gòu)的CPU除师,但國企效率又很低,遲遲不提供測試機器扔枫,又讓研究技術(shù)可行性汛聚。我們公司又只有X64架構(gòu)CPU的電腦,網(wǎng)上查到docker buildx插件可以構(gòu)建跨操作系統(tǒng)和CPU的鏡像短荐,就來研究一下倚舀,用的是ubuntu系統(tǒng)。
一忍宋、先安裝docker
#查看是否已經(jīng)安裝 ,19.03+的版本才支持buildx插件
docker -v 或docker version
#如果已經(jīng)有安裝痕貌,且版本過低的話,要先卸載:
apt remove docker docker-engine docker.io containerd runc
#安裝docker糠排,注意不要用docker-ce舵稠,版本太低。docker.io才是ubuntu維護的版本入宦;安裝過程中如果下載不成功導致失敗哺徊,可以多執(zhí)行幾次
apt install docker.io
#檢查docker是否安裝好
docker version
whereis docker #查看安裝位置
二、Docker 鏡像加速
直接從dockerHub下載鏡像會很慢乾闰,可以配置加速
阿里云鏡像獲取地址: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 自己去注冊一個落追。然后通過修改daemon配置文件/etc/docker/daemon.json來使用加速器。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://knb2n3ux.mirror.aliyuncs.com"],
"experimental": true
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
三涯肩、安裝Buildx
docker buildx 插件實現(xiàn)多平臺編譯淋硝,需要Docker 19.03+的版本。 下載buildx https://github.com/docker/buildx/releases/tag/v0.5.1 如果CPU為intel或AMD 則下載buildx-v0.5.1.linux-amd64, 下載后改名為buildx宽菜,然后執(zhí)行下面的腳本安裝谣膳。
mkdir -p ~/.docker/cli-plugins
mv buildx ~/.docker/cli-plugins/docker-buildx
cd ~/.docker/cli-plugins/
chmod +x docker-buildx
docker buildx --help #檢查是否安裝成功,查看命令幫助
# https://github.com/multiarch/qemu-user-static/releases/download/
# 安裝qemu铅乡,下載相應(yīng)的版本 qemu-$(uname -m)-static
chmod +x qemu-x86_64-static
mv qemu-x86_64-static /usr/local/bin/qemu-x86_64-static
四继谚、使用Buildx構(gòu)建測試
事先準備好用spring boot開發(fā)的測試jar包,和Dockfile文件阵幸,復(fù)制到同一個目錄下花履,然后執(zhí)行下面的腳本:
# 先創(chuàng)建構(gòu)造器并作為當前構(gòu)造器
docker buildx create --use --platform=linux/amd64,linux/arm64 --name localbuilder
# 構(gòu)建跨平臺的鏡像
docker buildx build --platform=linux/amd64,linux/arm64 -t elwin-test .
#查看本機鏡像
docker images
發(fā)現(xiàn)并沒有生成鏡像芽世,后來看了官方幫助,如果使用了--platform參數(shù)是不能直接生成鏡像的诡壁,只可以發(fā)布的dockerHub或者導出本地tar包济瓢。
先看發(fā)布到dockerHub,需要在https://hub.docker.com/ 注冊賬號,然后創(chuàng)建一個倉庫妹卿。
docker login #登錄到dockerHub
#注意-t的后面的標簽格式:用戶名/倉庫名:版本號
docker buildx build --platform=linux/amd64,linux/arm64 -t elwin942/test:v1 --push .
由于網(wǎng)速的原因旺矾,嘗試好多次才上傳成功,可以看到同時生成兩個不同架構(gòu)的鏡像了夺克。但是沒有arm64的系統(tǒng)箕宙,也不能下載arm64的鏡像。下載了amd64的鏡像執(zhí)行會出錯铺纽,但之前不用buildx構(gòu)建的鏡像又可以正常執(zhí)行柬帕。
嘗試構(gòu)建輸出為本地tar包再導入為鏡像:
# 構(gòu)建, 輸出到本地tar文件
docker buildx build --platform=linux/amd64,linux/arm64 -t elwin-test -o - >test.tar .
# 導入鏡像
cat test.tar | docker import --platform=linux/amd64 - elwin-test
# 查看鏡像,導成功
docker images
# 運行鏡像
docker run -d -p 8888:8888 elwin-test
# 查看容器
docker ps -a
還是會報錯:
docker: Error response from daemon: No command specified.
或者
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec : "java": executable file not found in $PATH: unknown.
網(wǎng)上搜索了幾天狡门,嘗試各種方法都解決不了陷寝,于是放棄了。
總結(jié)
buildx 最近一個版本是發(fā)布于2020年12月15日的v0.5.1版本其馏,還沒到1.0版本盼铁,可能還不是很成熟〕①耍或者機器環(huán)境的問題構(gòu)建的鏡像不能成功運行,因為時間的原因我嘗試了用Qemu虛擬出arm64的系統(tǒng)鹏控,最后成功完成任務(wù)致扯。如果遇到和我同樣的問題并且解決的話也歡迎告知!