首页/新闻资讯/正文详情

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

发布时间:2026/9/23 22:40:41 来源:云帆数科 栏目:资讯中心
我用 Docker 部署了一套完整的 AI 应用:从本地开发到云端上线,全流程踩坑记录
我用 Docker 部署了一套完整的 AI 应用从本地开发到云端上线全流程踩坑记录适合想把本地 AI 项目部署到线上、但被 Docker/部署流程搞晕的开发者。本文从 Dockerfile 编写到 docker-compose 编排到云端部署附完整的踩坑记录。背景本地跑得好好的部署就炸很多人有这个经历本地开发环境一切正常一部署到服务器就各种报错。“在我电脑上能跑啊”——这是部署环节最经典的问题。Docker 解决的就是这个问题把你的代码、依赖、配置打包成一个标准化的容器在任何环境都能跑。阶段 1编写 DockerfilePython 应用的 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 --frombuilder /root/.local /root/.local COPY . . ENV PATH/root/.local/bin:$PATH EXPOSE 8000 CMD [python, app.py]效果镜像从 1.2GB 减小到 300MB。阶段 2docker-compose 编排一个 AI 应用通常需要多个服务前端 后端 数据库 模型服务。version:3.8services:# 后端 APIbackend:build:./backendports:-8000:8000environment:-DATABASE_URLpostgresql://user:passdb:5432/mydb-MODEL_URLhttp://model:11434depends_on:db:condition:service_healthymodel:condition:service_startedrestart:unless-stopped# 前端frontend:build:./frontendports:-80:80depends_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 模型服务Ollamamodel:image:ollama/ollamavolumes:-ollama_data:/root/.ollamaports:-11434:11434restart: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 文件不要提交到 GitOPENAI_API_KEYsk-xxxxxDATABASE_URLpostgresql://user:passdb: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云端部署方案 1VPS最简单# 在服务器上安装 Dockercurl-fsSLhttps://get.docker.com|sh# 上传项目scp-r./project userserver:/app/# 启动sshuserservercd /app docker-compose up -d方案 2云容器服务# 推送镜像到云端仓库dockertag myapp:latest registry.example.com/myapp:latestdockerpush registry.example.com/myapp:latest# 在云控制台创建服务指定镜像地址方案 3CI/CD 自动部署# .github/workflows/deploy.ymlname:Deployon:push:branches:[main]jobs:deploy:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv4-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 userserver cd /app docker-compose pull docker-compose up -d踩坑记录坑 1Dockerfile 缓存失效症状每次构建都要重新安装所有依赖很慢。原因COPY . .放在pip install前面代码一改依赖层就失效。解决先COPY requirements.txt再pip install最后COPY . .。坑 2容器内访问不到其他服务症状后端连接数据库报 “Connection refused”。原因用了localhost但容器内的 localhost 是自己不是宿主机。解决用 docker-compose 的服务名如db作为主机名。# 错误DATABASE_URLpostgresql://user:passlocalhost:5432/mydb# 正确DATABASE_URLpostgresql://user:passdb:5432/mydb坑 3.dockerignore 没写症状镜像有 2GB包含了node_modules、.git、venv等无关文件。解决创建.dockerignorenode_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 模型文件有 5GBDocker 构建时下载超时。解决模型文件不打包进镜像用 Volume 挂载或者运行时下载。坑 6Nginx 反向代理配置错误症状前端能访问但 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.txtlocalhost 不通连接拒绝用服务名替代 localhost没写 .dockerignore镜像巨大排除 node_modules/.git数据丢失down 后数据没了用 Volume 持久化模型太大构建超时Volume 挂载模型Nginx 配置API 404正确配置 proxy_pass总结3 条核心经验Dockerfile 的 COPY 顺序很重要。先复制依赖文件再复制代码利用缓存层加速构建。用 docker-compose 管理多服务。不要手动docker run用 compose 文件声明所有服务的依赖关系和配置。Volume 持久化是必须的。数据库、模型文件、用户上传的文件都要用 Volume否则容器重启数据就没了。你部署 AI 应用时遇到过什么坑评论区交流。

相关推荐

制造业数字化成熟度: 企业完成数字化转型之后, 下一步任务是什么?
制造业数字化成熟度: 企业完成数字化转型之后, 下一步任务是什么?

文章核心内容:制造业数字化成熟度不要忽视业务层的变革制造商们正在将真金白银投入到那些承诺带来更好性能、更高效率和更深洞察力的技术中。但是,一旦这些投资到位,接下来该做什么?与此同时,制造商们正处在一个更加多… · 2026/9/23 22:40:41

鸿蒙音乐播放器实战02|主页Tab栏开发:原生Tabs导航+分层目录+多页面无缝切换
鸿蒙音乐播放器实战02|主页Tab栏开发:原生Tabs导航+分层目录+多页面无缝切换

承接上一篇项目基础,本篇实现APP核心主页架构:底部Tab导航栏 多页面滑动切换。采用鸿蒙官方原生 Tabs 组件开发,简化项目结构,无需额外冗余数据文件,所有代码就近编写、逻辑清晰,适合新手学习。本篇学习目… · 2026/9/22 14:17:10

机器人--robotstudio查找机械臂配置
机器人--robotstudio查找机械臂配置

修改文件后缀为zip,解压: · 2026/9/21 14:59:50

Cytoscape.js 元素 scratch 数据存储:在元素上安全保存非 JSON 临时数据的完整指南
Cytoscape.js 元素 scratch 数据存储:在元素上安全保存非 JSON 临时数据的完整指南

数据可视化 【免费下载链接】cytoscape.js Graph theory (network) library for visualisation and analysis 项目地址: https://gitcode.com/gh_mirrors/cy/cytoscape.js 点击查看 免费下载 导读 ele.scratch() 是 Cytoscape.js 为每个元素(节点与边&… · 2026/9/23 22:40:33

Mosquitto 1.0.4 发布说明深度解析:poll 事件处理、QoS2 内存泄漏与客户端限速修复
Mosquitto 1.0.4 发布说明深度解析:poll 事件处理、QoS2 内存泄漏与客户端限速修复

后端消息队列消息路由 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mos/mosquitto 点击查看 免费下载 导读 本文以 Eclipse Mosquitto 官方发布的 1.0.4(2012-10-17&#xf… · 2026/9/23 22:40:33

流形与流形学习:深度学习中的数据几何直觉
流形与流形学习:深度学习中的数据几何直觉

做深度学习这几年,我越来越发现很多领域的核心问题绕来绕去都会归结到一个数学概念上——流形(manifold)。不管你是做图像分类、语音识别、推荐系统还是生成模型,只要你在跟高维数据打交道,就一定躲不开流形这个词。但… · 2026/9/23 22:40:27

RenderDoc 结构化数据(Structured Data)系统完全指南:SDObject、SDFile 与 Python 访问实践
RenderDoc 结构化数据(Structured Data)系统完全指南:SDObject、SDFile 与 Python 访问实践

开发工具调试器图形学GPU 【免费下载链接】renderdoc RenderDoc is a stand-alone graphics debugging tool. 项目地址: https://gitcode.com/gh_mirrors/re/renderdoc 点击查看 免费下载 结构化数据(Structured Data)是 RenderDoc 内部用于… · 2026/9/23 22:40:27

相关性分析+CNN-Attention-LSTM的期货价格预测工程解析
相关性分析+CNN-Attention-LSTM的期货价格预测工程解析

简介:一套基于相关性分析的CNN-Attention-LSTM期货价格预测模型完整Python实现,主要面向深度学习方向毕业设计、课程设计以及时间序列预测研究人群。资源覆盖特征相关性分析、时间步滑动窗口处理、混合神经网络构建、训练与预测全流程,并对数… · 2026/9/23 22:40:27

PaddleSpeech 服务端 ASR Python 引擎解析:架构设计、初始化流程与请求处理全链路
PaddleSpeech 服务端 ASR Python 引擎解析:架构设计、初始化流程与请求处理全链路

人工智能语音音频NLP媒体生成 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation … · 2026/9/23 22:40:20

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码