Docker Buildx 構建多架構鏡像(Redis、Mysql、Java8、Nginx)

目標 ARM64 麒麟電腦無法直接拉取 Redis 鏡像,需在 Windows x86 電腦上通過 多架構構建工具(如 Docker Buildx) 生成適配 ARM64 的 Redis 鏡像,再打包傳輸到目標設備。

一、核心問題:跨架構鏡像兼容性

直接保存的 redis:latest 是 x86 鏡像,無法在 ARM64 設備上運行。
目標機器無法拉取鏡像,需在 Windows 上生成 ARM64 鏡像后手動傳輸。

二、解決方案:使用 Docker Buildx 構建多架構鏡像

步驟 1:啟用 Docker Buildx

確保 Docker Desktop 已啟用 Buildx(默認已支持):

docker buildx version

如果未啟用,在 Docker Desktop 設置中勾選 “Enable Docker BuildKit”。

步驟2:創建 Buildx 構建器(支持多架構)

1、列出所有構建器實例
docker buildx ls

在這里插入圖片描述
輸出表明當前系統中有 3 個可用的構建器實例(multiarch、default、desktop-linux),且它們均支持 多架構(ARM64、ARMv7、PPC64le 等)。
STATUS 為 running 表示實例可用。
PLATFORMS 需包含 linux/arm64,否則無法構建 ARM64 鏡像。

(1) 檢查當前使用的構建器

docker buildx inspect --bootstrap | findstr "Name"

如果輸出顯示的是 default,而 default 不支持 ARM64,則需要切換到其他實例(如 multiarch-builder)。

(2)如果已有支持 ARM64 的構建器
直接切換到該實例:

docker buildx use multiarch-builder

驗證是否切換成功:

docker buildx inspect --bootstrap | findstr "Platforms"

確保輸出包含 linux/arm64。

(3)如果現有構建器不支持 ARM64
刪除并根據下面的第2步重新初始化創建

# 刪除舊實例(如 multiarch-builder)
docker buildx rm multiarch-builder
2、如果沒有支持我想要的麒麟Linux的ARM64架構

①初始化 Buildx:

docker buildx create --name multiarch --use
docker buildx inspect --bootstrap

此命令創建并啟用一個支持多架構的構建器實例。
②驗證 Buildx 是否就緒:

docker buildx ls

確認輸出中包含 multiarch 構建器,且狀態為 ready。

注意
(1)multiarch 構建器如果已經支持 ARM64(linux/arm64),構建完Redis的配置后,后續構建 MySQL的 ARM64的版本鏡像時,可以跳過這步創建構建器了。
(2)multiarch 構建器 是全局的 Docker 資源,切換目錄不會影響其可用性。無論你在哪個目錄執行 docker buildx 命令,只要構建器名稱(如 multiarch)和配置正確,就可以正常使用。

步驟 3:構建 ARM64 版本的 Redis 鏡像

由于 Redis 官方鏡像已支持多架構,我們可以直接用 buildx 拉取并重新打包(命令中指定的 -f Dockerfile 要求必須存在該文件):

docker buildx build --platform linux/arm64 -t redis:arm64-custom --load -f Dockerfile .

注意:Dockerfile 是一個文本文件,包含一系列指令(如 FROM、RUN、COPY 等),用于自動化構建鏡像。沒有 Dockerfile,Docker 無法知道如何構建鏡像,更無法指定目標架構(如 ARM64)。

在執行 docker buildx build 時,因為打開的cmd默認當前目錄是(C:\Users\admin),一開始此目錄下是沒有 Dockerfile 文件的,如果只是想基于官方 redis:latest 鏡像構建 ARM64 版本,可以通過以下兩個方法在 C:\Users\admin 下創建一個簡單的 Dockerfile:
(1)創建 Dockerfile:

echo FROM --platform=linux/arm64 redis:latest > Dockerfile

或者用文本編輯器(如 Notepad)新建 Dockerfile,內容為:

# Dockerfile
FROM --platform=linux/arm64 redis:latest

或最簡單就是:
①右鍵空白處 → 新建 → 文本文檔。
②將文件名改為 Dockerfile(注意:刪除 .txt 后綴,確保文件類型為 Dockerfile 而非 Dockerfile.txt)。
③如果系統隱藏了擴展名,需先啟用顯示擴展名:在文件資源管理器中點擊 查看 → 勾選 文件擴展名。
用記事本打開 Dockerfile,粘貼以下內容:

FROM --platform=linux/arm64 redis:latest

(2)重新運行構建命令:

docker buildx build --platform linux/arm64 -t redis:arm64-custom --load .

在這里插入圖片描述
其實最好是先新建一個文件夾比如redisDockerfile,然后在該目錄下創建 Dockerfile,構建 ARM64 版本的redis鏡像,再通過步驟4打包tar文件。(因為還需要創建MySQL等鏡像然后打包,Dockerfile里需要的內容不一樣不能復用)

步驟 4:打包鏡像并傳輸

檢查本地鏡像列表

docker images

輸出示例:

REPOSITORY   TAG            IMAGE ID       CREATED        SIZE
redis        arm64-custom   62b6b206d951   10 minutes ago 105MB

如果鏡像名稱是 redis:arm64-custom,則應執行:

docker save -o redis-arm64.tar redis:arm64-custom

傳輸文件到 ARM64 設備:
使用 U 盤、SCP 或網絡共享將 redis-arm64.tar 復制到目標機器。

步驟5:在 ARM64 設備上加載并運行Redis

打開終端,cd到tar文件所在目錄;
1、加載鏡像:

sudo docker load -i redis-arm64.tar

2、運行 Redis 容器:

sudo docker run -d -p 6379:6379 --name my-redis redis:arm64-custom

3、驗證運行狀態:

sudo docker exec -it my-redis redis-cli

輸入PING結果PONG,容器 my-redis 正在運行與容器內的 Redis 服務正常響應;

三、最終: 測試redis連接

在目標電腦運行redis后,在另外一臺電腦通過docker測試能不能連接redis;
麒麟Linux使用hostname -I查看目標電腦IP;

docker run -it --rm redis redis-cli -h 199.169.39.77 -p 6379

在這里插入圖片描述
如果連接成功,會進入 Redis CLI,輸入 PING 應返回 PONG。
如果失敗,會報錯:

Could not connect to Redis at 199.169.39.77:6379: Connection refused

四、 拓展:

上面構建Redis已經創建過 ARM64 版本構建器,所以復用直接從步驟3開始構建ARM64 版本的 Mysql 、Java8鏡像。

一、構建 ARM64 版本的 Mysql 鏡像

步驟一、構建ARM64 版本的 Mysql 鏡像

在這里插入圖片描述
①右鍵空白處 → 新建 → 目錄 mysql-arm64-build→文本文檔。
②將文件名改為 Dockerfile(注意:刪除 .txt 后綴,確保文件類型為 Dockerfile 而非 Dockerfile.txt)。
③如果系統隱藏了擴展名,需先啟用顯示擴展名:在文件資源管理器中點擊 查看 → 勾選 文件擴展名。
用記事本打開 Dockerfile,粘貼以下內容:

docker buildx build --builder multiarch --platform linux/arm64 -t mysql-arm64:latest --load .

在這里插入圖片描述
出現importing to docker 說明成功構建ARM64 版本的 Mysql 鏡像。

步驟二、打包ARM64 版本的 Mysql 鏡像
docker save -o mysql-arm64.tar mysql-arm64:latest

在這里插入圖片描述

步驟三、在 ARM64 設備上加載并運行Mysql

打開終端,cd到tar文件所在目錄;
(1)在目標 ARM64 設備上加載 mysql-arm64.tar :

sudo docker load -i mysql-arm64.tar

(2)運行 MySQL 容器

sudo docker run -d --name mysql-arm64 -e MYSQL_ROOT_PASSWORD=yourpassword -p 3306:3306 mysql-arm64:latest

在這里插入圖片描述
如果3306端口被占用(默認密碼123456):

sudo docker run -d --name mysql-arm64 -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 mysql-arm64:latest

(3)驗證運行狀態

docker ps | grep mysql-arm64
docker logs mysql-arm64
步驟四、 測試連接
mysql -h 199.169.39.77 -P 3306 -u root -p

輸入密碼 yourpassword,成功連接后應看到 MySQL 提示符:

mysql>

在這里插入圖片描述

如果是3307:

mysql -h 199.169.39.77 -P 3307 -u root -p

二、構建 ARM64 版本的 Java8 鏡像

參考上面的MySQL

步驟一、構建ARM64 版本的 Java8 鏡像
cd D:\java8-arm64-build
docker buildx build --platform linux/arm64 -t java8-arm64:latest --load .
步驟二、打包ARM64 版本的 Java8 鏡像
docker save -o java8-arm64.tar java8-arm64:latest
步驟三、在 ARM64 設備上加載并運行Java8

打開終端,cd到tar文件所在目錄;
(1)在目標 ARM64 設備上加載 java8-arm64.tar :

sudo docker load -i java8-arm64.tar

(2)運行 Java8 容器
test-0.0.1-SNAPSHOT.jar位于目錄/data下,且application.yml(里面redis密碼默認無)也在該目錄下

sudo docker run -it --name java8 -v /data/test-0.0.1-SNAPSHOT.jar:/app/app.jar java8-arm64:latest java -jar /app/app.jar

查看日志:

sudo docker logs java8

補充:
①掛載整個目錄(推薦)

sudo docker run -it -v /data:/data java8-arm64:latest java -jar /data/test-0.0.1-SNAPSHOT.jar

掛載方式:
將主機 /data 目錄完整掛載到容器的 /data 目錄。
容器內可以直接訪問 /data 下的所有文件(如 JAR 包、配置文件 application.yml、日志文件等)。
優點:
靈活性高:如果 JAR 需要讀取同目錄下的配置文件(如 application.yml),無需額外掛載。
調試方便:容器內可以直接訪問 /data 下的所有文件(如查看日志、修改配置)。
避免路徑問題:無需擔心容器內目標目錄(如 /app)是否存在。
適用場景:
需要讀取多個關聯文件(JAR + 配置文件 + 資源文件)。
開發/測試時快速調試(可直接修改主機 /data 下的文件并重啟容器)。
注意事項:
確保容器內的工作目錄或命令路徑與掛載路徑一致(如 java -jar /data/xxx.jar)。
如果鏡像有默認用戶(如非 root),需確保該用戶對掛載目錄有權限。
②掛載單個 JAR 文件

sudo docker run -it -v /data/test-0.0.1-SNAPSHOT.jar:/app/app.jar java8-arm64:latest java -jar /app/app.jar

掛載方式:
僅將主機的 /data/test-0.0.1-SNAPSHOT.jar 文件掛載到容器的 /app/app.jar。
其他文件(如配置文件)不會被掛載,可能導致 JAR 啟動失敗(如果依賴外部配置)。
優點:
輕量:只掛載必要的文件,適合簡單場景。
隔離性:容器內 /app 目錄的其他文件不會被主機干擾。
缺點:
依賴文件缺失:如果 JAR 需要讀取 application.yml 或資源文件,必須額外掛載(否則會報錯)。
路徑依賴:容器內必須存在 /app 目錄(否則掛載失敗),且需確保命令中的路徑(/app/app.jar)匹配。
適用場景:
僅需運行單個 JAR 文件,且無外部配置依賴。
需要嚴格隔離主機和容器的文件系統。
改進建議:
如果必須掛載單個文件,建議同時掛載配置文件:

sudo docker run -it \-v /data/test-0.0.1-SNAPSHOT.jar:/app/app.jar \-v /data/application.yml:/app/application.yml \java8-arm64:latest \java -jar /app/app.jar

在這里插入圖片描述

步驟四、 測試

在終端里能不能成功運行后端

三、構建 ARM64 版本的 Nginx 鏡像

參考上面的MySQL

步驟一、構建ARM64 版本的 Nginx 鏡像
cd D:\nginx-arm64-build
docker buildx build --platform linux/arm64 -t nginx-arm64:latest -f Dockerfile . --load
步驟二、打包ARM64 版本的 Nginx 鏡像
docker save nginx-arm64:latest -o nginx-arm64.tar
步驟三、在 ARM64 設備上加載并運行Nginx

打開終端,cd到tar文件所在目錄;
(1)在目標 ARM64 設備上加載 nginx-arm64.tar :

sudo docker load -i nginx-arm64.tar

(2)運行 Nginx 容器

sudo docker run -d -p 80:80 --name nginx-test nginx-arm64:latest

補充:82是nginx監聽即容器端口,宿主機端口機瀏覽器外部訪問端口8085

sudo docker run -d --name nginx -p 8085:82 -v "/data/dist:/usr/share/nginx/html/dist" -v "/data/nginx.conf:/etc/nginx/conf.d/default.conf" nginx-arm64:latest

在這里插入圖片描述
80/tcp是容器nginx默認監聽80端口,但未被映射到宿主機即外部無法直接通過宿主機的 80 端口訪問

步驟四、 測試連接

1、使用瀏覽器訪問
打開瀏覽器,訪問 http://199.169.39.77(替換為 ARM64 設備的實際 IP)。
預期結果:
顯示 Nginx 默認歡迎頁或自定義的 index.html。
2、 使用 Test-NetConnection 測試 TCP 端口

Test-NetConnection 199.169.39.77 -Port 80

成功輸出:

ComputerName     : 199.169.39.77
RemoteAddress    : 199.169.39.77
RemotePort       : 80
TcpTestSucceeded : True

五、查詢所有容器狀態:

(1)檢查現有的所有容器,

sudo docker ps -a

應該有RedisMysql,而且STATUS里顯示的時up正在運行
(2)停止xxxid容器運行(如果是up狀態)

sudo docker stop xxxid

移除xxxid容器

sudo docker rm xxxid

(3)端口已經in use

sudo lsof -i :3306

顯示端口進程
(如果3306原本有mysql在運行,改sudo docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 mysql-arm64:latest)

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

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

相關文章

代理IP的安全陷阱:如何避免中間人攻擊與IP池污染?

在跨境業務、數據采集等場景中,代理IP已成為剛需工具。然而,其隱藏的安全風險卻常被忽視——輕則泄露隱私,重則導致賬號封禁、數據劫持甚至金融損失。本文將深入剖析兩大核心風險(中間人攻擊與IP池污染),并…

深入理解大語言模型中的超參數:Temperature、Top-p 與更多

隨著大語言模型(LLM)如 GPT、Claude、Gemini 的廣泛應用,調優生成文本的質量與風格成為開發者和研究人員的重要課題。其中,超參數(Hyperparameters)如 temperature 和 top_p 扮演了核心角色,影響…

譯碼器Multisim電路仿真匯總——硬件工程師筆記

目錄 74LS實現二線三線譯碼器 1 74LS139D和74LS138D基礎知識 1.1 74LS139D 二線四線譯碼器 1.1.1 功能特點 1.1.2 引腳功能 1.1.3 工作原理 1.1.4 應用場景 1.1.5 使用方法 1.1.6 注意事項 1.6.7 邏輯真值表 1.2 74LS138D 3線8線譯碼器 1.2.1 功能特點 1.2.2 引腳…

國產 OFD 標準公文軟件數科 OFD 閱讀器:OFD/PDF 雙格式支持,公務辦公必備

各位辦公軟件小達人們,今天咱來聊聊數科OFD閱讀器! 軟件下載地址安裝包 這軟件啊,是基于咱國家自主OFD標準的版式閱讀軟件,主要用來閱讀和處理OFD/PDF電子文件,還能用于公務應用擴展。它支持打開和瀏覽OFD/PDF格式的文…

vue中的toRef

在 Vue 中, toRef 函數用于將響應式對象的屬性轉換為一個獨立的 ref 對象,同時保持與原始屬性的關聯。其參數格式及用法如下: toRef 的參數說明 1. 參數 1:源對象(必須) - 類型: Object &…

暖通鍋爐的智能管控:物聯網實現節能又舒適?

暖通鍋爐系統在建筑供暖、工業供熱等領域扮演著重要角色,其運行效率和能源消耗直接關系到用戶的使用體驗和成本支出。傳統的暖通鍋爐管理方式往往依賴人工操作和經驗判斷,存在能耗高、調節不靈活、舒適性差等問題。隨著物聯網技術的發展,暖通…

PHP:從入門到進階的全面指南

PHP(Hypertext Preprocessor)作為一種廣泛使用的開源腳本語言,尤其適用于 Web 開發并可嵌入 HTML 中。自誕生以來,PHP 憑借其簡單易學、功能強大以及豐富的生態系統,成為了眾多網站和 Web 應用程序開發的首選語言之一。…

EXCEL 基礎函數

1、絕對引用、相對引用 1.1相對引用 相對引用,這是最常見的引用方式。復制單元格公式時,公式隨著引用單元格的位置變化而變化 例如在單元格內輸入sum(B2:C2),然后下拉填充柄復制公式。 可以看到每個單元格的公式不會保持sum(B2:C2)&#…

升級到MySQL 8.4,MySQL啟動報錯:io_setup() failed with EAGAIN

在升級到MySQL 8.4后,許多用戶在啟動數據庫時遇到了一種常見錯誤:“io_setup() failed with EAGAIN”。本文將深入探討該錯誤的原因,并提供詳細的解決方案。錯誤分析錯誤描述當你啟動MySQL時,可能會在日志文件中看到以下錯誤信息&…

【ECharts Y 軸標簽優化實戰:從密集到稀疏的美觀之路】

ECharts Y 軸標簽優化實戰:從密集到稀疏的美觀之路 📋 文章背景 在開發數據可視化模塊時,我們遇到了一個常見但棘手的圖表顯示問題:ECharts 圖表的 Y 軸標簽過于密集,影響了用戶體驗和數據的可讀性。本文將詳細記錄整個…

【鋰電池剩余壽命預測】GRU門控循環單元鋰電池剩余壽命預測(Pytorch完整源碼和數據)

目錄 效果一覽程序獲取程序內容代碼分享效果一覽 程序獲取 獲取方式一:文章頂部資源處直接下載:【鋰電池剩余壽命預測】GRU門控循環單元鋰電池剩余壽命預測(Pytorch完整源碼和數據) 獲取方式二:訂閱電池建模專欄獲取電池系列更多文件。 程序內容 1.【鋰電池剩余壽命預測…

Minstrel:多智能體協作生成結構化 LangGPT 提示詞

一、項目概述 Minstrel 是一個基于 LangGPT 框架的多智能體系統,自動生成結構化、人格化的提示詞。它通過多個協作代理,提升提示詞的準確性、多樣性和靈活性,適合非 AI 專家使用 (github.com)。 二、問題動機 當前 LLM 提示設計經驗依賴強…

Golang發送定時郵件

前面嘗試過用Python來發送郵件,下面測試一下Golang如何發送郵件 需要使用三方庫如下 1.安裝github.com/jordan-wright/email go get github.com/jordan-wright/email安裝完成之后代碼如下 package mainimport ("github.com/jordan-wright/email""log""…

CodeSys的軟PLC忘記了用戶名和密碼怎么辦

Codesys的win v3 x64軟PLC忘記用戶名和密碼怎么辦 概述檢查文件成功 概述 我曾經多次在運行了軟PLC后忘記了自己的用戶名和密碼。有些是回憶起來了,但有些真的想不起來了。沒有辦法后來是重新裝的CodeSys。這次從網上看到大佬寫的文章,試了一下&#xf…

【論文】微服務架構下分布式事務一致性解決方案設計與實踐

摘要 2022年3月至2023年6月,我作為首席架構師主導完成了某大型電商平臺訂單系統的微服務化改造項目。該項目日均處理訂單量達300萬筆,旨在解決原有單體架構在業務高峰期出現的性能瓶頸和事務一致性問題。本文重點論述在微服務架構下,如何通過Saga事務模式、事件溯源和最終一…

Matplotlib 安裝部署與版本兼容問題解決方案(pyCharm)

引言 Matplotlib 是 Python 中最常用的可視化庫之一,它是一個綜合性的繪圖庫,能夠創建靜態的、動畫的和可交互的可視化圖形圖像,能夠創建折線圖、散點圖,還是復雜的熱力圖、3D 繪圖等 matplotlib官網地址:https://ma…

《設計模式之禪》筆記摘錄 - 4.抽象工廠模式

抽象工廠模式的定義 抽象工廠模式(Abstract Factory Pattern)是一種比較常用的模式,其定義如下: Provide an interface for creating families of related or dependent objects without specifying ir concrete classes.(為創建一組相關或…

python-注釋

文章目錄 單行注釋多行注釋使用多個 # 符號使用三引號( 或 """) 特殊注釋Shebang(Unix/Linux 腳本聲明)編碼聲明(Python 2 需要)文檔字符串(Docstring) 在 Python 中…

YOLO11推理模式:極速高效的目標檢測新選擇

一、引言 在機器學習和計算機視覺領域,模型的推理(Inference)是應用階段的核心。Ultralytics 最新發布的 YOLO11 模型,憑借其強大的predict模式,在保證準確率的同時,極大提升了推理速度和多樣數據源兼容能…

如何創建基于 TypeScript 的 React 項目

React 是一個用于構建用戶界面的強大 JavaScript 庫。結合 TypeScript,您可以獲得類型安全和更好的開發體驗。本文將詳細介紹如何從頭開始創建一個基于 TypeScript 的 React 項目。 1. 為什么選擇 TypeScript? 在深入創建項目之前,我們先了解…