您的位置:首页 > 游戏 > 游戏 > 西双版纳_1688阿里巴巴批发网官网_临沂网站建设方案服务_关于校园推广的软文

西双版纳_1688阿里巴巴批发网官网_临沂网站建设方案服务_关于校园推广的软文

2025/4/21 14:55:16 来源:https://blog.csdn.net/weixin_37647148/article/details/147275706  浏览:    关键词:西双版纳_1688阿里巴巴批发网官网_临沂网站建设方案服务_关于校园推广的软文
西双版纳_1688阿里巴巴批发网官网_临沂网站建设方案服务_关于校园推广的软文

Docker镜像迁移指南:从Windows构建到Ubuntu运行

本文档详细介绍如何在Windows系统中构建SVM分类服务的Docker镜像,并将其迁移到Ubuntu系统中运行。

项目概述

本项目是一个使用FastAPI构建的SVM图像分类服务,可以将上传的图像分类为五种不同类型:corona、particle、floating、surface和void。

服务核心功能:

  • 接收上传的图像文件
  • 使用预训练的SVM模型进行图像分类
  • 返回预测类别和置信度

第一部分:在Windows上构建Docker镜像

1. 确保项目文件结构正确

svm_project/
│
├── svm_fastapi.py          # FastAPI应用主文件
├── svm_pd_model/           # 预训练模型目录
│   ├── svm_model.pkl       # SVM分类器模型
│   ├── svm_scaler.pkl      # 标准化器
│   └── svm_pca.pkl         # PCA降维器
├── Dockerfile              # Docker构建文件
└── requirements.txt        # Python依赖列表

2. 主应用文件内容(svm_fastapi.py)

以下是完整的应用代码:

from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse
import joblib
import cv2
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.svm import SVC
import uvicornapp = FastAPI()# 加载模型和预处理器
clf = joblib.load('./svm_pd_model/svm_model.pkl')
scaler = joblib.load('./svm_pd_model/svm_scaler.pkl')
pca = joblib.load('./svm_pd_model/svm_pca.pkl')# 定义类别
# categories = ['corona', 'particle', 'floating', 'surface']
categories = ['corona', 'particle', 'floating', 'surface','void'] # 读取新图像并转换为灰度图
def load_new_image(img_path):img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)if img is not None:img = cv2.resize(img, (64, 64))  # 调整图像大小img = img.flatten()  # 将图像展平成向量return imgelse:return None@app.post("/predict")
async def predict(file: UploadFile = File(...)):try:# 将文件保存到临时路径img_path = 'temp_image.jpg'with open(img_path, "wb") as buffer:buffer.write(await file.read())# 加载并处理图像new_image = load_new_image(img_path)if new_image is None:raise HTTPException(status_code=400, detail="Failed to process image")# 标准化和降维new_image = scaler.transform([new_image])new_image = pca.transform(new_image)# 预测new_pred = clf.predict(new_image)predicted_category = categories[new_pred[0]]# 获取预测概率pred_prob = clf.predict_proba(new_image)predicted_probability = pred_prob[0][new_pred[0]] * 100return JSONResponse(content={'predicted_category': predicted_category,'predicted_probability': f"{predicted_probability:.2f}%"})except Exception as e:raise HTTPException(status_code=500, detail=str(e))if __name__ == '__main__':uvicorn.run(app, host='0.0.0.0', port=9000)

3. 在Windows系统中配置Docker Desktop

  1. 确保已安装Docker Desktop并正常运行
  2. 配置Docker镜像加速(如果需要):
    • 打开Docker Desktop设置
    • 进入"Docker Engine"选项卡
    • 添加以下配置:
    {"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.xuanyuan.me", "https://docker.1ms.run"]
    }
    
    • 点击"Apply & Restart"

4. 在Windows上构建Docker镜像

打开PowerShell或命令提示符,执行以下命令:

# 切换到项目目录
cd E:\cursor_test\cursor_svm_test\svm_project# 构建Docker镜像
docker build -t svm_fastapi_app .

构建过程可能需要几分钟,具体取决于网络速度和计算机性能。

5. 将Docker镜像保存为tar文件

# 将镜像保存为tar文件
docker save -o svm_fastapi_app.tar svm_fastapi_app# 查看文件大小
dir svm_fastapi_app.tar

此操作将创建一个包含完整Docker镜像的tar文件,这个文件会比较大(通常为几百MB)。

第二部分:使用WinSCP将镜像传输到Ubuntu

1. 准备WinSCP传输

  1. 下载并安装WinSCP(如果尚未安装)
  2. 启动WinSCP应用程序
  3. 输入Ubuntu服务器的连接信息:
    • 主机名/IP地址
    • 端口(通常为22)
    • 用户名和密码
  4. 点击"登录"连接到Ubuntu服务器

2. 传输Docker镜像文件

  1. 在WinSCP左侧窗口(本地文件)导航到镜像所在目录:

    E:\cursor_test\cursor_svm_test\svm_project\
    
  2. 在WinSCP右侧窗口(远程文件)导航到目标目录:

    /home/your_username/svm_project/
    

    如果该目录不存在,可以右键创建新目录

  3. svm_fastapi_app.tar文件从左侧拖到右侧开始传输

  4. 等待传输完成(可能需要几分钟,取决于文件大小和网络速度)

第三部分:在Ubuntu系统上加载和运行Docker镜像

1. 登录到Ubuntu服务器

使用SSH客户端(如PuTTY)或直接在Ubuntu系统上打开终端。

2. 安装Docker(如果尚未安装)

# 更新包索引
sudo apt update# 安装Docker
sudo apt install -y docker.io# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker# 将当前用户添加到docker组(避免每次都需要sudo)
sudo usermod -aG docker $USER# 注销并重新登录,使权限生效
# 或者运行以下命令临时生效
newgrp docker

3. 加载Docker镜像

# 进入包含tar文件的目录
cd ~/svm_project# 加载Docker镜像
docker load -i svm_fastapi_app.tar

4. 验证镜像是否成功加载

# 查看所有Docker镜像
docker images

应该能看到名为svm_fastapi_app的镜像已经加载到系统中。

5. 运行Docker容器

# 运行容器
docker run -d --name svm_fastapi_container -p 9000:9000 --restart unless-stopped svm_fastapi_app

参数说明:

  • -d: 后台运行容器
  • --name svm_fastapi_container: 为容器指定名称
  • -p 9000:9000: 将容器内的9000端口映射到主机的9000端口
  • --restart unless-stopped: 设置容器自动重启策略
  • svm_fastapi_app: 使用的Docker镜像名称
容器名称冲突解决方案

如果遇到以下错误:

docker: Error response from daemon: Conflict. The container name "/svm_fastapi_container" is already in use by container "XXXX". You have to remove (or rename) that container to be able to reuse that name.

这表示已经存在同名容器,可以通过以下方法解决:

方法一:使用已有容器(如果是同一应用)

# 查看容器状态
docker ps -a | grep svm_fastapi_container# 如果容器已停止,启动它
docker start svm_fastapi_container# 如果需要重启容器
docker restart svm_fastapi_container

方法二:删除旧容器并创建新容器

# 先停止旧容器
docker stop svm_fastapi_container# 删除旧容器
docker rm svm_fastapi_container# 创建新容器
docker run -d --name svm_fastapi_container -p 9000:9000 --restart unless-stopped svm_fastapi_app

方法三:使用不同的容器名

# 使用不同的名称和端口
docker run -d --name svm_fastapi_container2 -p 9001:9000 --restart unless-stopped svm_fastapi_app
端口被占用解决方案

如果遇到以下错误:

Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint svm_fastapi_container (XXXX): failed to bind host port for 0.0.0.0:9000:172.17.0.X:9000/tcp: address already in use

这表示端口9000已被其他进程占用,可以通过以下方法解决:

方法一:查找并关闭占用端口的进程

# 查找占用9000端口的进程
sudo netstat -tulpn | grep 9000# 找到进程ID后关闭它
sudo kill <进程ID># 然后再尝试启动容器
docker start svm_fastapi_container

方法二:使用不同的端口映射

# 先删除现有容器
docker rm svm_fastapi_container# 使用不同的主机端口(例如9001)重新创建容器
docker run -d --name svm_fastapi_container -p 9001:9000 --restart unless-stopped svm_fastapi_app

使用方法二时,注意服务将在新端口(如9001)上可用,访问时需要使用:

http://服务器IP:9001/docs

方法三:检查是否有重复的容器在运行

# 查看所有运行中的容器
docker ps# 查看所有容器(包括已停止的)
docker ps -a# 如果发现有其他相似容器在运行,可以停止它们
docker stop <容器ID>

6. 验证容器运行状态

# 查看运行中的容器
docker ps# 查看容器日志
docker logs svm_fastapi_container

7. 测试API服务

使用curl命令测试图像分类API:

# 安装curl(如果尚未安装)
sudo apt install -y curl# 测试API服务
curl -X POST "http://localhost:9000/predict" -F "file=@/path/to/your/image.jpg"

或者,在浏览器中访问Swagger UI接口文档:

http://服务器IP:9000/docs

常见问题与解决方案

1. 镜像拉取或构建问题

如果在Windows上构建Docker镜像时遇到网络问题,可以尝试以下方法:

  • 配置更多的镜像加速器(见第一部分的步骤3)
  • 使用企业VPN或代理服务
  • 调整Docker Desktop的网络设置

2. 容器启动失败

如果容器无法正常启动,可以查看详细日志:

docker logs svm_fastapi_container

常见问题包括:

  • 模型文件路径不正确
  • 端口冲突
  • 内存不足

3. API服务无法访问

如果API服务运行但无法访问,检查:

# 检查服务器防火墙设置
sudo ufw status# 如需允许9000端口通过防火墙
sudo ufw allow 9000/tcp# 检查容器端口映射
docker port svm_fastapi_container

管理和维护

1. 停止和启动容器

# 停止容器
docker stop svm_fastapi_container# 启动容器
docker start svm_fastapi_container# 重启容器
docker restart svm_fastapi_container

2. 更新应用

当应用代码更新后,需要在Windows上重新构建镜像并重复上述迁移过程。

3. 容器数据持久化

如果需要在容器外部管理模型文件,可以使用卷挂载:

# 创建数据卷
docker volume create svm-models# 将模型文件复制到数据卷(需要临时容器)
docker run --rm -v svm-models:/data -v $(pwd)/svm_pd_model:/source ubuntu cp -r /source/* /data/# 启动容器并挂载数据卷
docker run -d --name svm_fastapi_container -p 9000:9000 -v svm-models:/app/svm_pd_model --restart unless-stopped svm_fastapi_app

结语

通过本指南,您已经学会了如何在Windows系统中构建Docker镜像,并将其迁移到Ubuntu系统中运行的完整流程。这种方法可以有效地解决在Ubuntu系统上直接构建Docker镜像时可能遇到的网络连接问题。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com