目錄
一、問題背景與分析
二、解決步驟
(一)檢查 docker-compose 版本
(二)升級 docker-compose
1. 對于 Linux 系統
2. 對于 Windows 系統
(三)驗證升級
(四)重新運行 docker-compose ps
三、遷移 x86 架構 Docker 鏡像至 ARM 環境
(一)環境配置
(二)注意事項
(三)鏡像拉取與轉換
1. 使用 Docker Buildx
(1)安裝 Docker Buildx
(2)創建構建器
(3)構建多平臺鏡像
2. 使用 qemu-user-static
(1)安裝 qemu-user-static
(2)構建 ARM 鏡像
(四)實際案例
1. Docker-Xiaoya 項目
2. 華為云鯤鵬架構 SpringBoot 微服務部署
四、其他注意事項
(一)查看系統架構
1. 使用 uname 命令
2. 使用 lscpu 命令
3. 查看 /proc/cpuinfo 文件
4. 使用 arch 命令
(二)重新標記鏡像
(三)避免端口沖突
五、總結
在目標機器上導入鏡像
注意事項
2. 重新標記鏡像
. 構建 ARM 架構的 Docker 鏡像
在 x86 架構的機器上,使用 Buildx 構建 ARM 架構的 Docker 鏡像:
3. 運行 ARM 架構的鏡像
關鍵修改點
1.?忽略警告
去官網查找是否有對應的arm版本
隨著 ARM 架構在服務器和邊緣計算領域的廣泛應用,將 x86 架構的 Docker 鏡像遷移到 ARM 環境變得越來越重要。本文將詳細介紹如何將 x86 架構的 Docker 鏡像轉換為 ARM 架構,并提供代碼示例和應用場景。
一、問題背景與分析
在進行遷移之前,我們先來看一個實際問題。假設你在運行 docker-compose ps
時遇到了錯誤,提示 docker-compose.yaml
文件中包含不支持的配置選項 profiles
。這表明你的 docker-compose
版本可能過低,無法識別這些配置選項。
profiles
是 Docker Compose 1.28.0 及更高版本引入的一個特性,用于定義服務的配置文件。如果你的 docker-compose
版本低于 1.28.0,就會出現這種錯誤。
二、解決步驟
(一)檢查 docker-compose 版本
你當前的 docker-compose
版本是 1.27.4,這是一個較舊的版本。你需要升級到 1.28.0 或更高版本。
(二)升級 docker-compose
根據你的操作系統,選擇合適的升級方法。
1. 對于 Linux 系統
sudo pip uninstall docker-compose
sudo pip install docker-compose
或者使用以下命令:
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d"')" /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2. 對于 Windows 系統
如果你使用的是 Windows,可以通過 Docker Desktop 的設置界面進行升級,或者手動下載最新版本的 docker-compose
并替換舊版本。
(三)驗證升級
升級完成后,運行以下命令驗證 docker-compose
版本:
docker-compose --version
確保版本號至少為 1.28.0 或更高。
(四)重新運行 docker-compose ps
升級完成后,再次運行以下命令:
docker-compose ps
這應該不會再報錯。
三、遷移 x86 架構 Docker 鏡像至 ARM 環境
(一)環境配置
在開始之前,確保你的開發環境已經準備好。你需要在 ARM 設備上安裝 Docker,并確保 Docker 支持多架構鏡像構建。
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
(二)注意事項
-
確保 QEMU 二進制文件已注冊:在 x86 架構的機器上運行 ARM 架構的鏡像,需要安裝 QEMU 并注冊 binfmt_misc 支持。
docker run --privileged --rm tonistiigi/binfmt --install all
-
啟用 Docker 實驗性功能:為了使用 Buildx 的多平臺構建功能,需要啟用 Docker 的實驗性功能。
sudo vi /etc/docker/daemon.json
添加以下內容:
{"experimental": true }
然后重啟 Docker 服務:
sudo systemctl daemon-reload sudo systemctl restart docker
(三)鏡像拉取與轉換
1. 使用 Docker Buildx
Docker Buildx 是基于 BuildKit 引擎的增強型構建工具,支持跨不同硬件架構構建容器鏡像。
(1)安裝 Docker Buildx
docker buildx install
(2)創建構建器
docker buildx create --name mybuilder --use
(3)構建多平臺鏡像
docker buildx build --platform linux/arm64 -t myimage:arm64 .
2. 使用 qemu-user-static
qemu-user-static 是一個用戶態模擬器,可以在 x86 平臺上運行 ARM 架構的容器。
(1)安裝 qemu-user-static
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
(2)構建 ARM 鏡像
docker build --tag myimage:arm64 .
(四)實際案例
1. Docker-Xiaoya 項目
Docker-Xiaoya 項目通過 Docker Compose 一鍵部署 Alist、Emby 和 Jellyfin 服務。
sudo apt install docker-compose
git clone https://gitcode.com/ghmirrors/do/docker-xiaoya
cd docker-xiaoya
docker-compose up -d
2. 華為云鯤鵬架構 SpringBoot 微服務部署
在華為云鯤鵬架構上部署 SpringBoot 微服務,涉及 elasticsearch、rabbitmq、mysql 等服務。
docker build -t mall:latest .
docker-compose.yml
文件內容如下:
version: '3'
services:mall:image: mall:latestports:- "8080:8080"mysql:image: arm64v8/mysql:5.7environment:MYSQL_ROOT_PASSWORD: rootpasswordelasticsearch:image: arm64v8/elasticsearch:8.12.2environment:- discovery.type=single-node
運行以下命令啟動服務:
docker-compose up -d
四、其他注意事項
(一)查看系統架構
在 CentOS 7 系統中,你可以通過多種方法來查看當前系統的架構(x86 或 ARM)。以下是幾種常用的方法:
1. 使用 uname 命令
uname -m
-
如果輸出是
x86_64
,則表示系統是基于 x86_64 架構的。 -
如果輸出是
armv7l
或aarch64
,則表示系統是基于 ARM 架構的。
2. 使用 lscpu 命令
lscpu
在輸出中,查找 Architecture
一行。
3. 查看 /proc/cpuinfo 文件
cat /proc/cpuinfo
在輸出中,查找 architecture
或 model name
一行。
[root@centos7 ~]# cat /proc/cpuinfo | grep "model name"
model name : Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz
4. 使用 arch 命令
arch
(二)重新標記鏡像
使用 docker tag
命令將一個鏡像重新標記為新的名稱和標簽。例如,假設你有一個名為 old-image:latest
的鏡像,你希望將其重命名為 new-image:v1
,可以運行以下命令:
docker tag old-image:latest new-image:v1
然后刪除舊鏡像并推送新鏡像:
docker rmi old-image:latest
docker push new-image:v1
(三)避免端口沖突
-
Centos 查看端口占用
比如查看 80 端口占用情況使用如下命令:
lsof -i tcp:80
-
列出所有端口
netstat -ntlp
五、總結
將 x86 架構的 Docker 鏡像遷移到 ARM 環境,不僅需要技術層面的精細操作,還需要對整體架構和資源利用有深入的理解。隨著 ARM 架構在服務器市場的逐步普及,掌握這一遷移技術將變得越來越重要。
補充:
-
導出鏡像: 使用
docker save
命令將鏡像導出為一個.tar
文件。例如,導出名為my-python-app:latest
的鏡像:docker save my-python-app:latest > my-python-app-latest.tar
在目標機器上導入鏡像
# 導入鏡像
docker load < /path/to/destination/my-python-app-latest.tar
注意事項
-
文件大小: 導出的
.tar
文件可能會比較大,具體取決于鏡像的大小。確保目標機器上有足夠的磁盤空間。 -
多平臺鏡像: 如果你導出的鏡像支持多個平臺(如 ARM 和 AMD64),導入后仍然可以使用這些多平臺鏡像。
2. 重新標記鏡像
-
拉取 ARM 架構的鏡像
使用 --platform
參數指定拉取 ARM 架構的鏡像:
docker pull --platform=linux/arm64 ubuntu/squid:latest
. 構建 ARM 架構的 Docker 鏡像
在 x86 架構的機器上,使用 Buildx 構建 ARM 架構的 Docker 鏡像:
#導入鏡像
docker buildx build --platform linux/arm64 --tag ubuntu/squid-arm:latest --load .
docker buildx build --platform linux/arm64 --tag postgres:15-alpine --load .
#導出鏡像
docker save ubuntu/squid:latest > ubuntu.tar
docker save postgres:15-alpine > postgres.tar
3. 運行 ARM 架構的鏡像
關鍵修改點
-
sysctls
配置:-
將
sysctls
配置從列表改為鍵值對映射:sysctls:net.core.somaxconn: "511"
-
-
healthcheck
配置:-
確保
healthcheck
的test
字段是一個列表:healthcheck:test: ["CMD", "redis-cli", "ping"]
-
1.?忽略警告
你可以通過配置 Redis 忽略這個警告。在 Redis 配置文件中(通常是 /etc/redis/redis.conf
或你的自定義配置文件),添加以下配置:
ignore-warnings ARM64-COW-BUG
如果你使用的是 docker-compose
,可以在 docker-compose.yml
文件中通過 command
參數添加這個配置。例如:
version: '3.8'services:redis:image: redis:6-alpinerestart: alwayssysctls:net.core.somaxconn: "511"environment:REDISCLI_AUTH: ${REDIS_PASSWORD:-difyai123456}volumes:- ./volumes/redis/data:/datacommand: redis-server --requirepass ${REDIS_PASSWORD:-difyai123456} --ignore-warnings ARM64-COW-BUGhealthcheck:test: ["CMD", "redis-cli", "ping"]
.直接解壓mydata.zip文件
[root@cgls ]# unzip mydata.zip
去官網查找是否有對應的arm版本
https://hub.docker.com/
amd64是X86架構的CPU,64位版。amd64又叫X86_64。主流的桌面PC,筆記本電腦,服務器(包括虛擬機)都在用X86_64的CPU。
arm64是ARM架構的CPU,64位版。蘋果新出的電腦在用ARM架構的CPU。有些路由器和嵌入式設備在用arm64的CPU。手機和安卓平板電腦最常用的CPU也是ARM架構的。
MIPS是MIPS架構的CPU。有些嵌入式設備和家用路由器在用MIPS架構的CPU。
避免端口沖突
1、Centos查看端口占用
比如查看80端口占用情況使用如下命令:
lsof -i tcp:80
2、列出所有端口
netstat -ntlp
ulimits:memlock:soft: ${OPENSEARCH_MEMLOCK_SOFT:--1}hard: ${OPENSEARCH_MEMLOCK_HARD:--1}nofile:soft: ${OPENSEARCH_NOFILE_SOFT:-65536}hard: ${OPENSEARCH_NOFILE_HARD:-65536}
希望本文的詳細解析能幫助你在實際操作中順利完成 x86 到 ARM 的 Docker 鏡像遷移。如果有任何問題或需要進一步的幫助,歡迎咨詢和交流。