Docker跨架构部署实操小结

 更新时间:2025年07月27日 14:28:39   作者:油泼辣子多加  
本文主要介绍了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 机上准备项目

创建 .dockerignore(减少镜像体积)
myapp/ 下新建 .dockerignore,内容示例:

__pycache__/
*.pyc
.git
.idea
*.log

编写 Dockerfile
myapp/ 下新建 Dockerfile,内容如下:

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

# 容器启动时执行主脚本
CMD ["python", "langou_model_mainfun.py"]

2. 在 X86 机上启用 Buildx + QEMU

检查 Docker 版本 & Buildx

docker version
docker buildx version

注册 QEMU 模拟器(支持在本机模拟 ARM 构建,使用国内镜像)

docker run --rm --privileged docker.1ms.run/multiarch/qemu-user-static --reset -p yes

创建并切换到 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. 构建 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

到此这篇关于Docker跨架构部署实操小结的文章就介绍到这了,更多相关Docker跨架构部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker部署nodejs开发环境详细步骤(基础示例篇)

    docker部署nodejs开发环境详细步骤(基础示例篇)

    这篇文章主要给大家介绍了docker部署nodejs开发环境详细步骤,docker是一个开源的应用容器引擎,可以为我们提供安全、可移植、可重复的自动化部署的方式,需要的朋友可以参考下
    2023-10-10
  • 理解Docker(1):Docker安装和基础用法详细介绍

    理解Docker(1):Docker安装和基础用法详细介绍

    本篇文章主要是介绍了Docker 安装和基础用法,对于想要需要的Docker的同学可以了解一下。
    2016-11-11
  • docker部署nginx服务的实现步骤

    docker部署nginx服务的实现步骤

    本文主要介绍了docker部署nginx服务的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 使用docker compose搭建一个elk系统的方法

    使用docker compose搭建一个elk系统的方法

    这篇文章主要介绍了使用docker-compose搭建一个elk系统的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • IDEA集成docker部署springboot项目的全过程

    IDEA集成docker部署springboot项目的全过程

    这篇文章主要介绍了IDEA集成docker部署springboot项目,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • CentOS7 Docker防火墙的简单配置教程

    CentOS7 Docker防火墙的简单配置教程

    这篇文章主要给大家介绍了关于CentOS7 Docker防火墙的简单配置方法,以及总结了docker在centos7下的一些坑,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-12-12
  • Docker与Jenkins实现RuoYi-Vue前后端分离项目的CICD全流程自动化

    Docker与Jenkins实现RuoYi-Vue前后端分离项目的CICD全流程自动化

    在现代软件开发流程中,持续集成/持续部署(CICD)已经成为提升开发效率、保障代码质量的关键实践,本文将详细介绍如何利用Docker容器化技术结合Jenkins,搭建一套完整的CICD流程,实现RuoYi-Vue前后端分离项目的自动化构建、测试和部署,从代码提交到自动部署的全流程自动化
    2026-01-01
  • Docker镜像压缩与优化操作

    Docker镜像压缩与优化操作

    这篇文章主要介绍了Docker镜像压缩与优化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Docker容器日志占用空间过大问题及解决

    Docker容器日志占用空间过大问题及解决

    这篇文章主要介绍了Docker容器日志占用空间过大问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 煮饺子论云原生docker与kubernetes之间的关系

    煮饺子论云原生docker与kubernetes之间的关系

    这篇文章主要为大家用煮饺子论的道理来为大家讲解一下云原生docker与kubernetes之间的关系,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-03-03

最新评论