我用 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 应用时遇到过什么坑评论区交流。