Docker跨架構(gòu)部署實操小結(jié)
需求場景
python項目,開發(fā)環(huán)境以及可供測試的環(huán)境為X86架構(gòu)下的LINUX服務(wù)器,但正式環(huán)境需要部署在ARM架構(gòu)下的麒麟服務(wù)器,且正式環(huán)境后續(xù)可能會長時間處于斷網(wǎng)狀態(tài),需要一份跨架構(gòu)的部署方案。
解決思路
在 X86 上打包、在 ARM(麒麟 Linux)上運行,最大的難點就在于二進制兼容性——X86 編譯出的可執(zhí)行文件(無論是用 PyInstaller 還是其它方式)都無法直接在 ARM 上跑。下面分別說一下兩種方案的利弊,供你決策時參考:
Docker 多架構(gòu)鏡像
優(yōu)點
- 環(huán)境一致性
通過 Dockerfile 明確聲明基礎(chǔ)鏡像、系統(tǒng)包、Python 版本、依賴庫版本等,避免「開發(fā)機能跑、線上機跑不起來」的坑。 - 多平臺支持
利用 Docker 官方提供的多架構(gòu)基礎(chǔ)鏡像(如python:3.x-slim),配合 Docker Buildx,可以一次性編譯出適用于 amd64、arm64 等多種架構(gòu)的鏡像。 - 零交叉編譯成本
你不需要在 X86 上搞復雜的交叉編譯工具鏈,只要在 Dockerfile 里寫好指令,Buildx 就能在后臺(或遠程 builder)幫你做。
缺點
- 鏡像體積
即便用slim或alpine,完整 Python 運行時的鏡像通常也在幾十 MB 以上,如果部署環(huán)境對鏡像大小有苛刻要求,可能需要你做深度瘦身。 - 運維依賴
線上機器要跑 Docker;如果你的正式環(huán)境是「只能跑二進制、不能裝 Docker」的受限環(huán)境,則不可用。
PyInstaller 打包成單文件可執(zhí)行
優(yōu)點
- 無須容器化
只要拿到一個可執(zhí)行文件,線上直接部署即可,不用關(guān)心 Docker 或容器平臺。 - 單文件交付
如果團隊習慣把交付物放到文件服務(wù)器、再由運維拷貝到目標機器,這種方式更簡單。
缺點
- 必須在 ARM 機器上打包
PyInstaller 打出來的 ELF 可執(zhí)行檔會綁定打包時的 CPU 架構(gòu);在 X86 上編的程序跑不了 ARM。你要么在真正的 ARM Kirin 機器上打包,要么在 X86 上借助 QEMU + chroot/交叉編譯環(huán)境才能打出 ARM 二進制,配置成本高。 - 依賴隱蔽
Python 動態(tài)庫、C 擴展包、系統(tǒng)庫等都要一一收集到打包目錄,版本不對就可能「缺少依賴」或「符號找不到」。
Docker 多架構(gòu)鏡像
下面給出一個 從 X86 機器打包,到 脫網(wǎng) ARM 麒麟服務(wù)器離線部署 的全流程示例。假設(shè)你的項目結(jié)構(gòu)和文件列表如下:
myapp/ ├── langou_model_mainfun.py ├── langou_model_dataprocessing.py ├── langou_model_function.py ├── langou_model_param.py ├── requirements.txt └── .dockerignore
1. 在 X86 機上準備項目
創(chuàng)建 .dockerignore(減少鏡像體積)
在 myapp/ 下新建 .dockerignore,內(nèi)容示例:
__pycache__/ *.pyc .git .idea *.log
編寫 Dockerfile
在 myapp/ 下新建 Dockerfile,內(nèi)容如下:
FROM docker.1ms.run/library/python:3.9-slim WORKDIR /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 # 容器啟動時執(zhí)行主腳本 CMD ["python", "langou_model_mainfun.py"]
2. 在 X86 機上啟用 Buildx + QEMU
檢查 Docker 版本 & Buildx
docker version docker buildx version
注冊 QEMU 模擬器(支持在本機模擬 ARM 構(gòu)建,使用國內(nèi)鏡像)
docker run --rm --privileged docker.1ms.run/multiarch/qemu-user-static --reset -p yes
創(chuàng)建并切換到 buildx Builder
docker buildx create --name mybuilder --use --driver docker-container --driver-opt image=docker.1ms.run/moby/buildkit:buildx-stable-1 docker buildx inspect --bootstrap
3. 構(gòu)建 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 架構(gòu)鏡像--output type=docker,dest=...tar:將鏡像導出為tar包
執(zhí)行完后,你會在 myapp/ 目錄看到 myapp_arm64_v1.0.tar。
4. 拷貝鏡像包到服務(wù)器
假設(shè)你在開發(fā)機上生成了 myapp_arm64_v1.0.tar,用 scp、USB 或其他方式,把它放到服務(wù)器上的某個目錄,比如 /opt/deploy/myapp/:
# 在開發(fā)機上 scp myapp_arm64_v1.0.tar root@arm-server:/opt/deploy/myapp/
5. 在服務(wù)器上加載鏡像
cd /opt/deploy/myapp/ docker load -i myapp_arm64_v1.0.tar
運行后你應(yīng)該能看到類似:
Loaded image: myapp:arm64-v1.0
6. 運行容器
在 docker run 時指定 --restart 參數(shù):
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. 驗證運行狀態(tài)
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
到此這篇關(guān)于Docker跨架構(gòu)部署實操小結(jié)的文章就介紹到這了,更多相關(guān)Docker跨架構(gòu)部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker設(shè)置獲取環(huán)境變量的方法實現(xiàn)
本文主要介紹了Docker設(shè)置獲取環(huán)境變量的方法實現(xiàn),包含設(shè)置環(huán)境變量到使用獲取,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-05-05
Windows?Docker部署Kong網(wǎng)關(guān)的實現(xiàn)步驟
Kong是一個輕量級、快速、靈活的云原生API網(wǎng)關(guān),本文主要介紹了Windows?Docker部署Kong網(wǎng)關(guān)的實現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下2024-03-03
docker環(huán)境下數(shù)據(jù)庫的備份(postgresql, mysql) 實例代碼
這篇文章主要介紹了docker環(huán)境下數(shù)據(jù)庫的備份(postgresql, mysql) ,需要的朋友可以參考下2019-05-05
使用Docker快速運行Firefox并實現(xiàn)遠程訪問本地火狐瀏覽器的詳細過程
文章介紹了如何在Docker中運行Firefox瀏覽器,并通過Cpolar內(nèi)網(wǎng)穿透工具實現(xiàn)遠程訪問,步驟包括部署Firefox、本地訪問、安裝Cpolar、配置公網(wǎng)地址、設(shè)置固定二級子域名等,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2025-02-02
docker-compose安裝db2數(shù)據(jù)庫操作
這篇文章主要介紹了docker-compose安裝db2數(shù)據(jù)庫操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Docker部署Ragflow(完美解決502 bad gateway)
本文主要介紹了Docker部署Ragflow,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-04-04

