Docker跨架構部署實操

需求場景

python項目,開發環境以及可供測試的環境為X86架構下的LINUX服務器,但正式環境需要部署在ARM架構下的麒麟服務器,且正式環境后續可能會長時間處于斷網狀態,需要一份跨架構的部署方案。

解決思路

在 X86 上打包、在 ARM(麒麟 Linux)上運行,最大的難點就在于二進制兼容性——X86 編譯出的可執行文件(無論是用 PyInstaller 還是其它方式)都無法直接在 ARM 上跑。下面分別說一下兩種方案的利弊,供你決策時參考:

Docker 多架構鏡像

優點
  1. 環境一致性
    通過 Dockerfile 明確聲明基礎鏡像、系統包、Python 版本、依賴庫版本等,避免「開發機能跑、線上機跑不起來」的坑。
  2. 多平臺支持
    利用 Docker 官方提供的多架構基礎鏡像(如 python:3.x-slim),配合 Docker Buildx,可以一次性編譯出適用于 amd64、arm64 等多種架構的鏡像。
  3. 零交叉編譯成本
    你不需要在 X86 上搞復雜的交叉編譯工具鏈,只要在 Dockerfile 里寫好指令,Buildx 就能在后臺(或遠程 builder)幫你做。
缺點
  1. 鏡像體積
    即便用 slimalpine,完整 Python 運行時的鏡像通常也在幾十 MB 以上,如果部署環境對鏡像大小有苛刻要求,可能需要你做深度瘦身。
  2. 運維依賴
    線上機器要跑 Docker;如果你的正式環境是「只能跑二進制、不能裝 Docker」的受限環境,則不可用。

PyInstaller 打包成單文件可執行

優點
  1. 無須容器化
    只要拿到一個可執行文件,線上直接部署即可,不用關心 Docker 或容器平臺。
  2. 單文件交付
    如果團隊習慣把交付物放到文件服務器、再由運維拷貝到目標機器,這種方式更簡單。
缺點
  1. 必須在 ARM 機器上打包
    PyInstaller 打出來的 ELF 可執行檔會綁定打包時的 CPU 架構;在 X86 上編的程序跑不了 ARM。你要么在真正的 ARM Kirin 機器上打包,要么在 X86 上借助 QEMU + chroot/交叉編譯環境才能打出 ARM 二進制,配置成本高。
  2. 依賴隱蔽
    Python 動態庫、C 擴展包、系統庫等都要一一收集到打包目錄,版本不對就可能「缺少依賴」或「符號找不到」。

Docker 多架構鏡像

下面給出一個 從 X86 機器打包,到 脫網 ARM 麒麟服務器離線部署 的全流程示例。假設你的項目結構和文件列表如下:

myapp/
├── langou_model_mainfun.py
├── langou_model_dataprocessing.py
├── langou_model_function.py
├── langou_model_param.py
├── requirements.txt
└── .dockerignore

1. 在 X86 機上準備項目

  1. 創建 .dockerignore(減少鏡像體積)
    myapp/ 下新建 .dockerignore,內容示例:

    __pycache__/
    *.pyc
    .git
    .idea
    *.log
    
  2. 編寫 Dockerfile
    myapp/ 下新建 Dockerfile,內容如下:

    FROM docker.1ms.run/library/python:3.9-slimWORKDIR /app# 復制依賴并安裝
    RUN pip3 install --no-cache-dir torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt# 復制所有源碼文件
    COPY . .# (可選)健康檢查:確保至少能 import 主模塊
    HEALTHCHECK --interval=30s --timeout=3s \CMD python -c "import langou_model_mainfun" || exit 1# 容器啟動時執行主腳本
    CMD ["python", "langou_model_mainfun.py"]
    

2. 在 X86 機上啟用 Buildx + QEMU

  1. 檢查 Docker 版本 & Buildx
docker version
docker buildx version
  1. 注冊 QEMU 模擬器(支持在本機模擬 ARM 構建,使用國內鏡像)
docker run --rm --privileged docker.1ms.run/multiarch/qemu-user-static --reset -p yes
  1. 創建并切換到 buildx Builder
docker buildx create --name mybuilder --use --driver docker-container --driver-opt image=docker.1ms.run/moby/buildkit:buildx-stable-1docker buildx inspect --bootstrap

3. 構建 ARM64 鏡像并導出為離線包

myapp/ 目錄下運行:

docker buildx build \--platform linux/arm64 \--tag myapp:arm64-v1.0 \--output type=docker,dest=./myapp_arm64_v1.0.tar \.
  • --platform linux/arm64:生成 ARM64 架構鏡像
  • --output type=docker,dest=...tar:將鏡像導出為 tar

執行完后,你會在 myapp/ 目錄看到 myapp_arm64_v1.0.tar

4. 拷貝鏡像包到服務器

假設你在開發機上生成了 myapp_arm64_v1.0.tar,用 scp、USB 或其他方式,把它放到服務器上的某個目錄,比如 /opt/deploy/myapp/

# 在開發機上
scp myapp_arm64_v1.0.tar root@arm-server:/opt/deploy/myapp/

5. 在服務器上加載鏡像

cd /opt/deploy/myapp/
docker load -i myapp_arm64_v1.0.tar

運行后你應該能看到類似:

Loaded image: myapp:arm64-v1.0

6. 運行容器

docker run 時指定 --restart 參數:

docker run -d \--name myapp \--restart always \-v /opt/deploy/myapp/conf:/app/conf:ro \-e SOME_ENV=foo \myapp:arm64-v1.0
  • --restart no (默認)容器退出后不重啟
  • --restart on-failure[:max-retries]
  • --restart always 宿主機重啟后始終重啟容器
  • --restart unless-stopped 類似 always,但如果你手動 docker stop 過,就不會再自動重啟

推薦使用 --restart unless-stopped,這樣即使遇到異常也重啟,但運維手動停過就不會被“頑固”重啟。

7. 驗證運行狀態

docker ps
docker logs myapp
  • docker ps:查看容器是否在運行
  • docker logs myapp:查看啟動日志,確認沒有錯誤

Tip

  • 如果你不需要掛載任何外部文件,則直接:
docker run -d --name myapp myapp:arm64-v1.0
  • 要停止或刪除容器:
docker stop myapp
docker rm myapp

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

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

相關文章

JavaScript 樹形菜單總結

樹形菜單是前端開發中常見的交互組件,用于展示具有層級關系的數據(如文件目錄、分類列表、組織架構等)。以下從核心概念、實現方式、常見功能及優化方向等方面進行總結。 一、核心概念 層級結構:數據以父子嵌套形式存在,如{ id: 1, children: [{ id: 2 }] }。節點:樹形結…

【python實用小腳本-131】Python 實現 HTML 到 PDF 轉換:解決文檔處理痛點的高效工具

引言 在當今數字化辦公環境中,文檔格式的轉換需求日益頻繁。假設你是一位市場營銷人員,需要將公司網站的產品介紹頁面(HTML 格式)轉換為 PDF 文檔,以便用于線下宣傳。然而,手動復制粘貼內容并調整格式不僅…

【Linux操作系統】簡學深悟啟示錄:Linux基本指令

文章目錄1.什么是操作系統?2.Xshell的使用3.常用指令3.1 ls指令3.2 pwd指令3.3 cd指令3.4 touch指令3.5 mkdir指令3.6 rmdir指令 && rm指令3.7 man指令3.8 cp指令3.9 mv指令3.10 cat指令3.11 echo指令(重定向)3.12 more指令3.13 less…

「py數據分析」04如何將 Python 爬取的數據保存為 CSV 文件

如何將 Python 爬取的數據保存為 CSV 文件 從原始網絡數據到純凈 CSV - 搭建通往分析的橋梁 恭喜你!經過前面的努力,你的 Python 腳本終于成功地從一個網站上爬取了數據,一個充滿信息的寶庫正靜靜地躺在你的變量中。但接下來呢?…

qemu vcpu的創建過程

在 QEMU 中,vCPU 線程的啟動流程涉及多個階段,包括初始化、線程創建和執行邏輯。以下是基于搜索結果的詳細分析: QEMU vCPU 線程的啟動流程 1. 初始化階段 設備實例化:QEMU 使用 QOM(QEMU Object Model)系統…

Spring Security架構與實戰全解析

Spring security1.安全架構1. 認證who are you登陸系統:用戶系統2. 授權權限管理:用戶授權3. 攻擊防護xss (cross-site scripting)csrf (cross-site request forgery)cors (cross-origin resource sharing)sql注入4. 擴展:權限管理模型a. RBA…

LeetCode Hot 100 搜索二維矩陣 II

編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性:每行的元素從左到右升序排列。每列的元素從上到下升序排列。示例 1:輸入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[…

Windows Edge 播放 H.265 視頻指南

目錄 📌前言 一 . 什么是 H.265(HEVC)? 二、為什么 Edge 默認不能播放 H.265? 三、Edge 播放 H.265 解決方案 1 . 查看顯卡是否支持硬解AMD GPU Decoder Device InformationNVIDIA GPU Decoder Device Informat…

線性代數--AI數學基礎復習

原文鏈接:Github-Funny_Mr_Zhi GNN_playground 參考:麻省理工公開課 線性代數 MIT Linear Algebra Chapter1 可以帶著問題去讀,線性代數到底是什么,矩陣又是什么。盡管深入學習數學需要一種抽離出現實和直觀理解的高度抽象思維&…

Cursor配置DeepSeek調用MCP服務實現任務自動化

文章目錄1. 任務需求2. 環境準備2.1 Cursor安裝2.2 Node.js安裝2.3 DeepSeek模型Key申請2.4 高德地圖Key申請3. MCP服務配置3.1 Cursor配置Server方式3.1.1全局設置3.1.2 項目級別設置3.2 MCP服務接入3.2.1 高德地圖MCP服務3.2.2 Mysql MCP服務3.2.3 FileSystem MCP服務3.2.4 驗…

java SpringBoot數據庫查詢 時間范圍查詢

exTime的類型為varchar 存儲的數據格式為yyy-MM-ddTHH:mm:ss,查詢時傳進來的時間格式也需要為yyy-MM-ddTHH:mm:ss格式Query(value "SELECT * FROM test_fbep fbep WHERE delFlag 1 " "AND IF(?1 ! AND ?1 IS NOT NULL, fbep.passId ?1, TRUE) " &q…

Linux 操作系統如何實現軟硬件解耦?從容器與硬件接口封裝談起

在計算機系統中,軟硬件解耦是提升系統靈活性、可移植性和可維護性的核心設計思想。Linux 作為開源操作系統的典范,通過數十年的演進形成了一套成熟的解耦機制。本文將從容器技術和硬件接口封裝兩個維度,深入解析 Linux 如何實現軟硬件解耦&am…

7月10號總結 (1)

今天開始寫web項目&#xff0c;畫了一下登錄界面&#xff0c;借鑒了一下網上的資源。 <!DOCTYPE html> <html lang"zh.CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…

Docker 高級管理 -- 容器通信技術與數據持久化

目錄 第一節:容器通信技術 一&#xff1a;Docker 容器的網絡模式 1&#xff1a;Bridge模式 2&#xff1a;Host模式 3&#xff1a;Container模式 4&#xff1a;None模式 5&#xff1a;Overlay 模式 6&#xff1a;Macvlan 模式 7&#xff1a;自定義網絡模式 二&#xff…

鏈路管理和命令管理

第1章 鏈路管理在通信領域&#xff0c;鏈路&#xff08;Link&#xff09; 是兩個設備之間進行數據傳輸的物理或邏輯路徑。例如&#xff1a;網絡鏈路&#xff1a;TCP/IP 連接、UDP 通信、WebSocket串口鏈路&#xff1a;RS232、RS485、CAN 總線無線鏈路&#xff1a;藍牙、Wi-Fi、…

BERT模型基本原理及實現示例

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是Google在2018年提出的預訓練語言模型&#xff0c;其核心思想是通過雙向Transformer結構捕捉上下文信息&#xff0c;為下游NLP任務提供通用的語義表示。 一、模型架構BERT基于Transforme…

NPM組件包 json-cookie-csv 等竊取主機敏感信息

【高危】NPM組件包 json-cookie-csv 等竊取主機敏感信息 漏洞描述 當用戶安裝受影響版本的 json-cookie-csv 等NPM組件包時會竊取用戶的主機名、用戶名、工作目錄、IP地址等信息并發送到攻擊者可控的服務器地址。 MPS編號MPS-xo1f-4kue處置建議強烈建議修復發現時間2025-07-…

【Netty+WebSocket詳解】WebSocket全雙工通信與Netty的高效結合與實戰

一、 Netty網絡框架、WebSocket協議基礎 1.1 Netty網絡框架介紹 1.2 WebSocket簡介 1.3 WebSocket握手流程 二、為什么選擇NettyWebSocket&#xff1f; 三、NettyWebSocket與Spring WebSocket 3.1 架構層級對比 3.2 核心組件差異 3.3 協議支持深度 3.4 性能基準測試 3.5 開發…

5、Vue中使用Cesium實現交互式折線繪制詳解

引言 Cesium是一款強大的開源3D地理信息可視化引擎&#xff0c;廣泛應用于數字地球、地圖可視化等領域。在Vue項目中集成Cesium可以快速構建高性能的地理信息應用。本文將詳細介紹如何在Vue項目中實現交互式折線繪制功能&#xff0c;包括頂點添加、臨時繪制、距離計算等核心功…

mysql實戰之主從復制

原理圖理論&#xff1a;一、配置準備每臺主機都安裝mysql對每臺主機都進行對時操作&#xff0c;減少時間誤差[rooteveryone ~]# timedatectl set-timezone Asia/Shanghai [rooteveryone ~]# systemctl restart chronyd.service 對每臺主機都進行關閉防火墻、上下文等&#xff0…