Docker跨架构部署实操第二弹
1. 项目内容
- 项目目录包含
Dockerfile
与main.py
,并且容器内路径固定为:- 数据:
/root/autodl-tmp/data
- 模型:
/root/autodl-tmp/models
- 保存:
/root/autodl-tmp/save
- 数据:
- 服务端口:
9011
(容器内与宿主映射为-p 9011:9011
)。 - 文档示例以 Ubuntu(Linux)与 PowerShell(管理员)(Windows Server)为主,命令请根据实际路径与用户名替换。
2. Linux部署步骤
2.1 在 Ubuntu 上安装 Docker
# 1. 卸载旧版本(若存在)
sudo apt-get remove -y docker docker-engine docker.io containerd runc || true# 2. 更新系统并安装依赖
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release# 3. 添加 Docker 官方 GPG key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/keyrings/docker.gpg# 4. 添加 Docker APT 源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \| sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt-get update# 5. 安装 Docker Engine
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 6. 启动并检查
sudo systemctl enable --now docker
sudo systemctl status docker# 7. 可选:把当前用户加入 docker 组(避免 sudo)
sudo usermod -aG docker $USER
# 重新登录或运行:newgrp docker
注意:有些最小化镜像或云镜像没有
systemd
,在这些环境systemctl
可能不可用,需使用容器/发行版特定方法启动dockerd
。
2.2 配置 Docker 镜像加速
编辑 /etc/docker/daemon.json
(如果文件不存在则创建):
{"registry-mirrors": ["https://<your-mirror-host>"]
}
修改完成后:
sudo systemctl daemon-reload
sudo systemctl restart docker
2.3 构建镜像与运行容器
假设项目在 /home/you/project
:
cd /home/you/project
docker build -t my-flask-model:latest .# 运行容器并挂载三个目录
docker run -d \--name my-flask-model \--restart unless-stopped \-p 9011:9011 \-v /home/you/project/data:/root/autodl-tmp/data \-v /home/you/project/models:/root/autl-dtmp/models \-v /home/you/project/save:/root/autodl-tmp/save \my-flask-model:latest
1. 构建镜像
docker build -t my-flask-model:latest .
docker build
:构建 Docker 镜像。-t my-flask-model:latest
:给镜像命名为my-flask-model
,版本号latest
。.
:构建上下文(当前目录),包含 Dockerfile 与项目代码。
2. 运行容器
docker run -d [参数...] my-flask-model:latest
(1) 基础参数
-d
:后台运行(detached mode)。--name my-flask-model
:容器名称,便于管理。--restart unless-stopped
:自动重启策略。always
→ 总是重启。unless-stopped
→ 仅在手动 stop 后不再重启。no
→ 默认,不重启。
(2) 端口映射
-p 9011:9011
- 格式:
宿主机端口:容器端口
。 - 把宿主机 9011 端口映射到容器 9011 端口,用于访问 Flask 服务。
(3) 目录挂载
-v 宿主机目录:容器目录
- 数据目录:
-v /home/you/project/data:/root/autodl-tmp/data
宿主机数据集共享给容器。 - 模型目录:
-v /home/you/project/models:/root/autodl-tmp/models
存储训练好的模型文件,保证持久化。 - 保存目录:
-v /home/you/project/save:/root/autodl-tmp/save
存储上传文件或中间结果。
快速测试接口(本机):
curl -v -F "file=@./CustomModel.py" http://localhost:9011/train
2.4 常用管理与排查命令
# 查看容器
docker ps -a
# 日志
docker logs -f my-flask-model
# 进入容器
docker exec -it my-flask-model /bin/bash
# 停止/启动/重启
docker stop my-flask-model
docker start my-flask-model
docker restart my-flask-model
# 删除
docker rm -f my-flask-model
docker rmi my-flask-model:latest
2.5 运行部署脚本
#!/usr/bin/env bash
set -e# 简易安装脚本(Ubuntu)
# 用法: sudo ./install_docker_ubuntu.shsudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-releasesudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/keyrings/docker.gpgecho "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \| sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker# 给出提示
echo "Docker 安装完成。运行 'docker run --rm hello-world' 测试。"
3. Windows Server 2022部署
重要说明(先读):
- Windows Server 2022 可启用 WSL2,并支持离线安装。
- 推荐方案:在 Server 上离线安装 WSL2 与 Docker Desktop,通过 Docker Desktop 提供的 Linux 环境直接运行 Linux 容器。
- Docker Desktop 已包含轻量 Linux VM(基于 WSL2),因此无需在 WSL 内额外安装 Docker Engine。
3.1 总体流程
- 在 Windows Server 2022 上启用
Microsoft-Windows-Subsystem-Linux
与VirtualMachinePlatform
功能。 - 从 GitHub 下载 WSL2 离线安装包(WSL 官方发布页),完成 WSL2 安装。
- 离线安装 Docker Desktop(可在联网机器下载
.exe
安装包,拷贝到 Server 执行)。 - 启动 Docker Desktop(其内部会自动启动 Linux 容器环境)。
- 在 Docker Desktop 的环境中,构建镜像并运行容器。
3.2 启用 WSL2 功能
# PowerShell(Admin)
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart# 可选:启用 Hyper-V(某些功能需要)
# dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V-All /all /norestartRestart-Computer -Force
3.3 安装 WSL2 离线包
- 到 WSL Releases 下载
.msixbundle
或.msi
离线包。 - 拷贝到 Server 并运行安装。
- 安装完成后,WSL2 就可用(Docker Desktop 会自动用它作为后端)。
![[7bbf3292-6019-422e-b14c-3a8578b968d8.png]]
3.4 安装 Docker Desktop(离线)
- 到 Docker Desktop 官方下载页 获取安装包(Windows
.exe
)。 - 在联网机器下载后,直接安装运行 ```
- 安装完成后,在 Docker Desktop 设置里确认:
- General → Use the WSL 2 based engine 已勾选。
- 确保分配给 Docker 的 CPU/内存资源合理。
3.5 构建与运行项目容器
在 PowerShell (Windows) 下:
cd C:\project
docker build -t my-flask-model:latest .docker run -d `--name my-flask-model `--restart unless-stopped `-p 9011:9011 `-v C:\project\data:/root/autodl-tmp/data `-v C:\project\models:/root/autodl-tmp/models `-v C:\project\save:/root/autodl-tmp/save `my-flask-model:latest
docker build
和docker run
实际运行在 Docker Desktop 提供的 Linux 容器环境中。- 通过
-v
参数挂载 Windows 文件夹到容器内路径,实现数据与模型的持久化。 - 服务可在宿主机
http://localhost:9011
或服务器 IP 上访问。
3.6 说明
- 不需要在 WSL 内单独安装 Docker Engine,因为 Docker Desktop 已提供完整的 Linux 容器运行环境。
- 如果只运行 Linux 容器(你的 Flask 项目就是),推荐全程使用 Docker Desktop。
- 如果未来需要运行 Windows 容器,则可考虑安装 Docker Engine for Windows 并启用 Windows 容器模式。
4.虚拟机下windows部署
如果 Windows Server 2022 是安装在虚拟机中的,需要开启 二次虚拟化(Nested Virtualization) 才能运行 WSL2 和 Docker Desktop。
1. VMware 设置
-
关闭虚拟机
-
打开 VMware → 选中虚拟机 →
编辑虚拟机设置
-
进入 处理器(CPU) 设置
-
勾选:
- ✅ 虚拟化 Intel VT-x/EPT 或 AMD-V/RVI
- ✅ 将虚拟化应用到客户机操作系统
-
保存并重启虚拟机 → 进入 Windows Server → 安装 WSL2 & Docker。
2. Hyper-V 设置(可选)
如果是 Hyper-V,需要确保宿主机开启:
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
5. 项目特定注意事项
- 文件保存路径与挂载:你的
main.py
将文件保存到/root/autodl-tmp/models
与/root/autodl-tmp/save
等路径。确保宿主机对应目录存在且容器用户有写权限(如果在容器内使用 root,通常无问题;若你改变容器运行用户,需注意权限)。 - 依赖版本兼容性:
skl2onnx.convert_sklearn
对scikit-learn
版本有兼容性要求;如果在容器内遇到转换错误,请考虑固定(pin)scikit-learn
与skl2onnx
版本。 - 持久化与备份:模型与保存目录应做宿主机持久化(你已通过
-v
挂载)。建议在生产环境中定期备份/root/autodl-tmp/models
。 - 构建缓存:Docker 构建时可利用缓存加速,CI/CD 环境中建议合理拆分
Dockerfile
,将变化少的依赖放在前面。 - 日志与监控:容器内
print()
会输出到主机日志(docker logs
)。建议在生产中把日志采集到集中化系统(如 ELK、Prometheus + Grafana)。
6. 常见问题与解决建议
-
容器启动但端口无法访问:
- 检查
docker ps
的端口映射是否正确; - 检查宿主防火墙(Linux iptables / firewalld;Windows 防火墙)是否放行 9011;
- 容器内 Flask 是否成功监听
0.0.0.0:9011
(而不是127.0.0.1
)。
- 检查
-
文件挂载后容器内看不到文件:
- 确保主机路径存在并且有正确权限;
- 在 Windows 上,建议在 WSL 内运行 Docker 构建/运行以避免路径与权限问题。
-
docker build
卡在 pip install:- 网络问题或 PyPI 源慢;Dockerfile 中已使用国内镜像(如果你在国内),也可以在
pip install
增加--timeout
或使用预下载的 wheel 包。
- 网络问题或 PyPI 源慢;Dockerfile 中已使用国内镜像(如果你在国内),也可以在
-
WSL 离线导入时报错:
- 确认已安装并正确运行
wsl_update_x64.msi
,并重启 Windows; - 检查
wsl --status
输出以确认默认版本与已导入发行版版本。
- 确认已安装并正确运行
7. 生产环境可选增强
- 使用反向代理(Nginx/Traefik)做 TLS 终端与请求转发;
- 将服务容器化编排到 Kubernetes / Docker Swarm 实现高可用与弹性伸缩;
- 用 CI/CD(GitHub Actions、GitLab CI、Jenkins)自动构建/推送镜像并在目标机上自动部署;
- 对敏感数据(如模型权重、密钥)使用机密管理(Vault、Kubernetes Secrets 等)。