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 等)。