x86 架構 Docker 鏡像遷移至 ARM 環境的詳細指南

目錄

一、問題背景與分析

二、解決步驟

(一)檢查 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

(二)注意事項

  1. 確保 QEMU 二進制文件已注冊:在 x86 架構的機器上運行 ARM 架構的鏡像,需要安裝 QEMU 并注冊 binfmt_misc 支持。

    docker run --privileged --rm tonistiigi/binfmt --install all
  2. 啟用 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 架構的。

  • 如果輸出是 armv7laarch64,則表示系統是基于 ARM 架構的。

2. 使用 lscpu 命令
lscpu

在輸出中,查找 Architecture 一行。

3. 查看 /proc/cpuinfo 文件
cat /proc/cpuinfo

在輸出中,查找 architecturemodel 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

(三)避免端口沖突

  1. Centos 查看端口占用

    比如查看 80 端口占用情況使用如下命令:

    lsof -i tcp:80
  2. 列出所有端口

    netstat -ntlp

五、總結

將 x86 架構的 Docker 鏡像遷移到 ARM 環境,不僅需要技術層面的精細操作,還需要對整體架構和資源利用有深入的理解。隨著 ARM 架構在服務器市場的逐步普及,掌握這一遷移技術將變得越來越重要。

補充:

  1. 導出鏡像: 使用 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

注意事項

  1. 文件大小: 導出的 .tar 文件可能會比較大,具體取決于鏡像的大小。確保目標機器上有足夠的磁盤空間。

  2. 多平臺鏡像: 如果你導出的鏡像支持多個平臺(如 ARM 和 AMD64),導入后仍然可以使用這些多平臺鏡像。

2. 重新標記鏡像

  1. 拉取 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 架構的鏡像

關鍵修改點

  1. sysctls 配置

    • sysctls 配置從列表改為鍵值對映射:

      sysctls:net.core.somaxconn: "511"
  2. healthcheck 配置

    • 確保 healthchecktest 字段是一個列表:

      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 鏡像遷移。如果有任何問題或需要進一步的幫助,歡迎咨詢和交流。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96121.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96121.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

零代碼部署工業數據平臺:TRAE + TDengine IDMP 實踐

對于編程初學者來說&#xff0c;軟件開發流程中的開發環境配置、安裝異常或報錯往往需要花費大量時間查閱資料和反復試錯&#xff0c;才能正常安裝和啟動某些軟件工具。現在&#xff0c;在 TRAE 的幫助下&#xff0c;即使完全沒有接觸過編程&#xff0c;也能通過自然語言直接表…

史上最全Flink面試題(完整版)

1、簡單介紹一下 FlinkFlink 是一個框架和分布式處理引擎&#xff0c;用于對無界和有界數據流進行有狀態計算。并且 Flink 提供了數據分布、容錯機制以及資源管理等核心功能。Flink提供了諸多高抽象層的API以便用戶編寫分布式任務&#xff1a;DataSet API&#xff0c; 對靜態數…

C# .NET中使用log4Net日志框架指南

C# .NET中使用log4Net日志框架指南 log4Net是Apache基金會開發的一款高效、靈活的日志記錄框架&#xff0c;廣泛應用于.NET生態系統中。它支持多種日志輸出目標&#xff08;如文件、數據庫、控制臺&#xff09;&#xff0c;并提供細粒度的日志級別控制&#xff0c;幫助開發者監…

每日算法刷題Day68:9.10:leetcode 最短路6道題,用時2h30min

一. 單源最短路&#xff1a;Dijkstra 算法 1.套路 1.Dijkstra 算法介紹 (1)定義 g[i][j] 表示節點 i 到節點 j 這條邊的邊權。如果沒有 i 到 j 的邊&#xff0c;則 g[i][j]∞。 (2)定義 dis[i] 表示起點 k 到節點 i 的最短路長度&#xff0c;一開始 dis[k]0&#xff0c;其余 …

Spring Boot + Apache Tika 從文件或文件流中提取文本內容

應用效果&#xff1a;1、安裝 Apache Tika 依賴pom.xml<!-- Apache Tika 從文件中提取結構化文本和元數據 --><dependency><groupId>org.apache.tika</groupId><artifactId>tika-core</artifactId><version>2.9.2</version>&l…

qqq數據結構補充

1.緒論1.存儲方式順序存儲&#xff1a;邏輯相鄰&#xff0c;物理相鄰鏈式存儲&#xff1a;邏輯相鄰&#xff0c;物理不一定相鄰2.線性表1.順序表1.不可擴容數組寫一個順序表1.在頭文件中應有#pragam once&#xff0c;防止頭文件多次編譯&#xff1b;如果頭文件多次編譯&#x…

Anaconda與Jupyter 安裝和使用

Anaconda內部集成了很多科學計算包&#xff0c;并且可以實現環境隔離 1. 安裝Anaconda 定義&#xff1a;Anaconda是一個集成的Python發行版&#xff0c;專為數據科學、機器學習和AI開發而設計。它包含了常用的Python庫、包管理工具&#xff08;Conda&#xff09;和Jupyter No…

5.后臺運行設置和包設計與實現

程序的入口點(想讓其后臺默認.exe進程運行)也可以不通過vs設置也可以通過定義預處理設置第三種就是沒有窗口的變成后臺運行的了 處理client傳來的數據包 第一步&#xff1a;咱們怎么設計一種包呢&#xff1f;FEFF在網絡環境里面出現的概率低所以就采用這個 自己數據包截斷了&am…

【開題答辯全過程】以 基于微信小程序校園綜合服務平臺的設計與實現為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

地級市人口集聚、經濟集聚、產業集聚與綠色經濟效率匹配數據(含區域經濟研究相關的控制變量,Excel|shp|免費數據)

D006 地級市人口集聚、經濟集聚、產業集聚與綠色經濟效率匹配數據&#xff08;含區域經濟研究相關的控制變量&#xff0c;Excel|shp|免費數據&#xff09;數據簡介今天我們分享的數據是2004-2020年地級市人口聚集、經濟聚集與綠色經濟效率匹配數據&#xff0c;并對其進行可視化…

視覺SLAM第7講:視覺里程計2(3D-2D:PnP、3D-3D:ICP)

接上文&#xff0c;視覺SLAM第7講&#xff1a;視覺里程計1&#xff08;特征點法、2D-2D對極約束&#xff09;&#xff0c;本節主要學習3D-2D:PnP、3D-3D:ICP。 目錄 7.7 3D-2D:PnP 7.7.1 直接線性變換&#xff08;DLT&#xff09; 7.7.2 P3P 1.原理 2.小結 7.7.3 最小化重…

友元的功能解析

目錄 一、友元的作用 二、實例說明 1. 友元方法 例&#xff1a; 2.友元類 例&#xff1a; 三、注意事項 一、友元的作用 1. 可以讓一個類外 函數 或 類對象 訪問一個 類內私有 成員或方法。 二、實例說明 1. 友元方法 例&#xff1a; 用friend 關鍵字在Tom 類中聲明…

GNSS校準氣壓計

1、gnss信號較好的時候得到的GNSS高&#xff0c;得到海拔高。2、氣壓計數據轉到標準數據然后計算出來海拔高。3、gnss高作基準 - 氣壓高 高差 &#xff1b;需要修正的是氣壓偏差&#xff0c;那么如何得到氣壓偏差1&#xff09;用gnss高 反求出一個氣壓&#xff0c;這個氣壓與…

基于Springboot + vue3實現的校園二手交易平臺

項目描述本系統包含管理員、用戶兩個角色。管理員角色&#xff1a;用戶管理&#xff1a;管理系統中所有用戶的信息&#xff0c;包括添加、刪除和修改用戶。配置管理&#xff1a;管理系統配置參數&#xff0c;如上傳圖片的路徑等。權限管理&#xff1a;分配和管理不同角色的權限…

新型存儲介質應用:CXL內存擴展技術與AI工作負載適配

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;AI計算的內存瓶頸挑戰 當前AI技術發展正面臨著一…

Java 多線程(二)

目錄synchronized刷新內存synchronized的特性可重入的出現死鎖的情況如何避免死鎖&#xff08;重點&#xff0c;死鎖的成因和解決&#xff09;volatile關鍵字wait和notify多線程的代碼案例餓漢模式和懶漢模式的線程安全問題指令重排序問題阻塞隊列使用自己實現一個阻塞隊列實現…

MySql 內外連接

1.內連接內連接實際上就是利用where子句對兩種表形成的笛卡兒積進行篩選&#xff0c;我們前面學習的查詢都是內連 接&#xff0c;也是在開發過程中使用的最多的連接查詢。 語法&#xff1a;select 字段 from 表1 inner join 表2 on 連接條件 and 其他條件&#xff1b;備注&…

【大前端】 斷點續傳 + 分片上傳(大文件上傳優化) 的前端示例

寫一個 斷點續傳 分片上傳&#xff08;大文件上傳優化&#xff09; 的前端示例。這樣即使網絡中斷&#xff0c;文件也可以從已上傳的部分繼續傳&#xff0c;不需要重新傳整個大文件。&#x1f539; 分片上傳 斷點續傳思路分片切割&#xff1a;把大文件切成固定大小的小塊&…

機器學習的發展與應用:從理論到現實

目錄 引言 一、機器學習的發展歷程 1. 萌芽階段&#xff08;1950s–1970s&#xff09; 2. 符號主義與統計學習階段&#xff08;1980s–1990s&#xff09; 3. 數據驅動與算法突破&#xff08;2000s–2010s&#xff09; 4. 深度學習崛起&#xff08;2012年至今&#xff09; …

Python實現訊飛星火大模型Spark4.0Ultra的WebSocket交互詳解

核心架構設計與初始化機制 代碼采用面向對象的設計模式構建了Ws_Param類作為核心配置載體。該類在初始化時接收四個關鍵參數:APPID(應用標識)、APIKey(接口密鑰)、APISecret(簽名秘鑰)和Spark_url(服務端點地址)。通過urlparse模塊解析URL結構,分離出主機名(host)與…