当前位置: 首页 > news >正文

我用 Docker 部署了一套完整的 AI 应用:从本地开发到云端上线,全流程踩坑记录

我用 Docker 部署了一套完整的 AI 应用:从本地开发到云端上线,全流程踩坑记录

适合想把本地 AI 项目部署到线上、但被 Docker/部署流程搞晕的开发者。
本文从 Dockerfile 编写到 docker-compose 编排到云端部署,附完整的踩坑记录。

背景:本地跑得好好的,部署就炸

很多人有这个经历:本地开发环境一切正常,一部署到服务器就各种报错。

“在我电脑上能跑啊”——这是部署环节最经典的问题。

Docker 解决的就是这个问题:把你的代码、依赖、配置打包成一个标准化的容器,在任何环境都能跑

阶段 1:编写 Dockerfile

Python 应用的 Dockerfile

# 基础镜像(用 slim 版减小体积) FROM python:3.12-slim # 设置工作目录 WORKDIR /app # 先复制依赖文件(利用 Docker 缓存层) COPY requirements.txt . # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 复制项目代码 COPY . . # 暴露端口 EXPOSE 8000 # 启动命令 CMD ["python", "app.py"]

多阶段构建(减小镜像体积)

# 阶段 1:构建 FROM python:3.12 as builder WORKDIR /app COPY requirements.txt . RUN pip install --user --no-cache-dir -r requirements.txt # 阶段 2:运行(只复制必要的文件) FROM python:3.12-slim WORKDIR /app COPY --from=builder /root/.local /root/.local COPY . . ENV PATH=/root/.local/bin:$PATH EXPOSE 8000 CMD ["python", "app.py"]

效果:镜像从 1.2GB 减小到 300MB。

阶段 2:docker-compose 编排

一个 AI 应用通常需要多个服务(前端 + 后端 + 数据库 + 模型服务)。

version:'3.8'services:# 后端 APIbackend:build:./backendports:-"8000:8000"environment:-DATABASE_URL=postgresql://user:pass@db:5432/mydb-MODEL_URL=http://model:11434depends_on:db:condition:service_healthymodel:condition:service_startedrestart:unless-stopped# 前端frontend:build:./frontendports:-"80:80"depends_on:-backendrestart:unless-stopped# 数据库db:image:postgres:16environment:POSTGRES_USER:userPOSTGRES_PASSWORD:passPOSTGRES_DB:mydbvolumes:-pgdata:/var/lib/postgresql/datahealthcheck:test:["CMD-SHELL","pg_isready -U user"]interval:5stimeout:5sretries:5restart:unless-stopped# AI 模型服务(Ollama)model:image:ollama/ollamavolumes:-ollama_data:/root/.ollamaports:-"11434:11434"restart:unless-stoppedvolumes:pgdata:ollama_data:

启动:

# 一键启动所有服务docker-composeup-d# 查看状态docker-composeps# 查看日志docker-composelogs-fbackend

阶段 3:环境变量管理

不要把密钥写在代码里,用环境变量。

# docker-compose.ymlservices:backend:environment:-OPENAI_API_KEY=${OPENAI_API_KEY}-DATABASE_URL=${DATABASE_URL}env_file:-.env
# .env 文件(不要提交到 Git)OPENAI_API_KEY=sk-xxxxxDATABASE_URL=postgresql://user:pass@db:5432/mydb
# .gitignore.env

阶段 4:数据持久化

Docker 容器重启后数据会丢失。用 Volume 持久化。

services:db:volumes:-pgdata:/var/lib/postgresql/data# 数据库数据model:volumes:-ollama_data:/root/.ollama# AI 模型文件backend:volumes:-./uploads:/app/uploads# 用户上传的文件-./logs:/app/logs# 日志文件volumes:pgdata:ollama_data:

阶段 5:健康检查

确保服务真正可用,不只是"容器在运行"。

services:db:healthcheck:test:["CMD-SHELL","pg_isready -U user"]interval:5stimeout:5sretries:5backend:healthcheck:test:["CMD","curl","-f","http://localhost:8000/health"]interval:10stimeout:5sretries:3depends_on:db:condition:service_healthy# 数据库健康后才启动后端

阶段 6:云端部署

方案 1:VPS(最简单)

# 在服务器上安装 Dockercurl-fsSLhttps://get.docker.com|sh# 上传项目scp-r./project user@server:/app/# 启动sshuser@server"cd /app && docker-compose up -d"

方案 2:云容器服务

# 推送镜像到云端仓库dockertag myapp:latest registry.example.com/myapp:latestdockerpush registry.example.com/myapp:latest# 在云控制台创建服务,指定镜像地址

方案 3:CI/CD 自动部署

# .github/workflows/deploy.ymlname:Deployon:push:branches:[main]jobs:deploy:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v4-name:Build and pushrun:|docker build -t myapp:${{ github.sha }} . docker tag myapp:${{ github.sha }} registry.example.com/myapp:latest docker push registry.example.com/myapp:latest-name:Deployrun:|ssh user@server "cd /app && docker-compose pull && docker-compose up -d"

踩坑记录

坑 1:Dockerfile 缓存失效

症状:每次构建都要重新安装所有依赖,很慢。

原因COPY . .放在pip install前面,代码一改依赖层就失效。

解决:先COPY requirements.txt,再pip install,最后COPY . .

坑 2:容器内访问不到其他服务

症状:后端连接数据库报 “Connection refused”。

原因:用了localhost,但容器内的 localhost 是自己,不是宿主机。

解决:用 docker-compose 的服务名(如db)作为主机名。

# 错误DATABASE_URL="postgresql://user:pass@localhost:5432/mydb"# 正确DATABASE_URL="postgresql://user:pass@db:5432/mydb"

坑 3:.dockerignore 没写

症状:镜像有 2GB,包含了node_modules.gitvenv等无关文件。

解决:创建.dockerignore

node_modules .git venv __pycache__ *.pyc .env

坑 4:数据库数据丢失

症状docker-compose down后数据库数据全没了。

原因:没用 Volume 持久化。

解决:用docker-compose down不加-v参数(保留 Volume),或者用 named volume。

# 保留数据docker-composedown# 删除数据(慎用!)docker-composedown-v

坑 5:模型文件太大,镜像构建超时

症状:AI 模型文件有 5GB,Docker 构建时下载超时。

解决:模型文件不打包进镜像,用 Volume 挂载或者运行时下载。

坑 6:Nginx 反向代理配置错误

症状:前端能访问,但 API 请求 404。

原因:Nginx 没有正确代理/api路径到后端。

解决

server { listen 80; location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://backend:8000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

踩坑总结表

症状解决
缓存失效构建慢先 COPY requirements.txt
localhost 不通连接拒绝用服务名替代 localhost
没写 .dockerignore镜像巨大排除 node_modules/.git
数据丢失down 后数据没了用 Volume 持久化
模型太大构建超时Volume 挂载模型
Nginx 配置API 404正确配置 proxy_pass

总结

3 条核心经验:

  1. Dockerfile 的 COPY 顺序很重要。先复制依赖文件再复制代码,利用缓存层加速构建。

  2. 用 docker-compose 管理多服务。不要手动docker run,用 compose 文件声明所有服务的依赖关系和配置。

  3. Volume 持久化是必须的。数据库、模型文件、用户上传的文件都要用 Volume,否则容器重启数据就没了。


你部署 AI 应用时遇到过什么坑?评论区交流。

http://www.jsqmd.com/news/1038203/

相关文章:

  • 江北黄金回收全攻略:6家好店、4种渠道、5条忠告,一篇全搞定 - 宁波早知道
  • Tortoise ORM:Python 异步世界的 Django 风格 ORM
  • 2026 年北京洋酒高价回收机构甄选:专业鉴定与高溢价变现行业参考 - 资讯纵览
  • 常州保时捷帕拉梅拉音响改装 音乐人生打造劲浪乌托邦打造移动音乐厅 - 音乐人生汽车音响
  • 从同质化内卷到差异化突围!Qi认证构筑产品核心竞争力
  • 三分钟上手LuckyLilliaBot:多协议QQ机器人搭建全攻略
  • 2026专业的天津全屋定制源头服务商TOP3 - 信息热点
  • 工会端午节发放福利方案
  • 重庆燃气安全设备哪家强?五大品牌全维度深度测评 - 资讯纵览
  • 公司发的京东E卡怎么换钱?2026京东E卡回收攻略(附回收价格、变现流程、避坑指南) - 资讯纵览
  • 024、ONNX作为算子中间表示的优缺点分析
  • 天津高端全屋定制高性价比工厂指南 省钱又靠谱的选择 - 信息热点
  • 靠谱的北京高端全屋定制工厂推荐:7条必查筛选标准 - 信息热点
  • 2026年投标资质办理服务平台实测口碑排行:10家平台资质、通过率、服务全维度对比 - 互联网科技品牌测评
  • 2026天津4家热门全屋定制源头工厂测评 - 信息热点
  • 6种字重的苹方字体:跨平台设计开发的专业解决方案
  • Seedream 2.0深度解析:中文文生图的工程化破局之道
  • 助睿Max数据大屏实战:从零搭建浏览器用户画像分析系统
  • 图片怎么改成指定宽高像素?用秒转工具箱小程序就能调 - 效率工具研究所
  • 【对比】测评系列:又测了 5 个酒店/机票 API 服务
  • 2026天津靠谱全屋定制源头厂家推荐清单 - 信息热点
  • 探秘新干芝麻灰厂家:实用指南助你获取厂家电话,开启石材采购新旅程 - 资讯纵览
  • 重庆工业气体检测设备怎么选?六大品牌深度测评榜单 - 资讯纵览
  • 天津高端全屋定制工厂怎么选?5个核心标准 - 信息热点
  • 靠谱的北京高端全屋定制服务商盘点:费用与适配解析 - 信息热点
  • D5渲染器怎么用云电脑?
  • 2026深圳安装监控深度测评:如何为你的场景匹配最佳方案? - 资讯纵览
  • MPLAB串行存储器套件实战:SPI/I2C EEPROM读写与调试全解析
  • 靠谱的企业管理咨询公司测评:3类需求适配指南 - 资讯纵览
  • Java 面试:在电商场景中的核心技术与应用