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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…