怎么用 Docker 把 KNow 部署到服务器前九篇完成了 KNow 产品的所有功能开发。本篇回答三个问题Docker 镜像怎么构建和优化docker-compose 怎么编排所有服务上线前要做哪些安全检查Docker 镜像怎么构建和优化后端 Dockerfile# backend/Dockerfile FROM python:3.11-slim AS builder WORKDIR /app COPY requirements.txt . # 在构建阶段安装依赖利用 Docker 缓存 RUN pip install --no-cache-dir -r requirements.txt # 正式镜像 FROM python:3.11-slim WORKDIR /app # 安装运行时依赖不含构建工具减小镜像体积 RUN apt-get update apt-get install -y --no-install-recommends \ libmagic1 \ rm -rf /var/lib/apt/lists/* # 从 builder 阶段复制已安装的包 COPY --frombuilder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY . . EXPOSE 8000 CMD [uvicorn, app.main:app, --host, 0.0.0.0, --port, 8000]为什么用多阶段构建构建阶段有编译器和构建工具运行时不需要。多阶段构建可以把镜像体积从 1.2GB 降到 400MB。前端 Dockerfile# frontend/Dockerfile FROM node:20-alpine AS builder WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npm run build FROM nginx:alpine COPY --frombuilder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD [nginx, -g, daemon off;]前端 nginx 配置# frontend/nginx.conf server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; location / { 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; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_read_timeout 120s; } }docker-compose 怎么编排所有服务完整编排文件# docker-compose.ymlservices:postgres:image:postgres:16-alpineenvironment:POSTGRES_DB:knowPOSTGRES_USER:knowPOSTGRES_PASSWORD:${DB_PASSWORD}volumes:-postgres_data:/var/lib/postgresql/datahealthcheck:test:[CMD-SHELL,pg_isready -U know]interval:10stimeout:5sretries:5redis:image:redis:7-alpinevolumes:-redis_data:/datahealthcheck:test:[CMD,redis-cli,ping]qdrant:image:qdrant/qdrant:latestvolumes:-qdrant_data:/qdrant/storageminio:image:minio/minio:latestenvironment:MINIO_ROOT_USER:${MINIO_USER}MINIO_ROOT_PASSWORD:${MINIO_PASSWORD}volumes:-minio_data:/datacommand:server /databackend:build:./backendenv_file:.envdepends_on:postgres:{condition:service_healthy}redis:{condition:service_healthy}qdrant:{condition:service_started}minio:{condition:service_started}frontend:build:./frontendports:-80:80depends_on:-backendvolumes:postgres_data:redis_data:qdrant_data:minio_data:环境变量模板# .env不要提交 GitDB_PASSWORDyour_secure_passwordMINIO_USERknow_adminMINIO_PASSWORDyour_minio_passwordLLM_API_KEYsk-your-keyLLM_BASE_URLhttps://api.deepseek.com/v1JWT_SECRETyour_random_secret_here一键部署# 克隆代码gitclone https://github.com/your/know.gitcdknow# 配置环境变量cp.env.example .env# 编辑 .env 填入真实密钥# 启动dockercompose up-d--build# 查看日志dockercompose logs-f# 更新gitpulldockercompose up-d--build上线前要做哪些安全检查1. 密钥检查# 不要把这些硬编码在代码里❌ JWT_SECRET123456❌ DB_PASSWORDpassword❌ API_KEYsk-test✅ 使用环境变量或密钥管理服务2. CORS 配置# 生产环境限制来源app.add_middleware(CORSMiddleware,allow_origins[https://your-domain.com],allow_methods[GET,POST],allow_headers[Authorization,Content-Type],)3. 速率限制# 防止 API 被滥用fromslowapiimportLimiter limiterLimiter(key_funcget_remote_address)app.state.limiterlimiterrouter.post(/api/chat/stream)limiter.limit(30/minute)asyncdefchat_stream():...4. 数据备份# 定时备份数据库03* * *dockerexecknow-postgres pg_dump-Uknow know/backup/know_$(date\%Y\%m\%d).sql# 保留最近 30 天04* * *find/backup-nameknow_*.sql-mtime30-delete上线 checklist□ 所有密码和密钥已修改不追求认密码 □ HTTPS 证书已配置 □ CORS 已限制域名 □ 速率限制已启用 □ 数据库备份已配置 □ 日志轮转已配置 □ Docker 镜像已优化多阶段构建 □ .env 文件未提交 Git □ 容器以非 root 用户运行 □ 健康检查接口已配置总结步骤做的事构建镜像多阶段构建前端用 nginx 托管静态文件编排服务docker-compose 管理 6 个服务安全加固CORS、限流、密钥管理、备份上线验证按 checklist 逐项确认本文是《AI 全栈开发实战——做一个真正的产品》系列的第 10 篇。系列目录1-9 已完成10. Docker 部署 ← 你在这里如果觉得有用欢迎点赞 收藏 关注。这个系列从产品定义写到生产上线全部代码开源可运行带你从零交付一个真正的 AI 产品。
AI 全栈开发实战(10):Docker 部署与线上发布——从构建镜像到生产上线
发布时间:2026/7/5 15:05:38
怎么用 Docker 把 KNow 部署到服务器前九篇完成了 KNow 产品的所有功能开发。本篇回答三个问题Docker 镜像怎么构建和优化docker-compose 怎么编排所有服务上线前要做哪些安全检查Docker 镜像怎么构建和优化后端 Dockerfile# backend/Dockerfile FROM python:3.11-slim AS builder WORKDIR /app COPY requirements.txt . # 在构建阶段安装依赖利用 Docker 缓存 RUN pip install --no-cache-dir -r requirements.txt # 正式镜像 FROM python:3.11-slim WORKDIR /app # 安装运行时依赖不含构建工具减小镜像体积 RUN apt-get update apt-get install -y --no-install-recommends \ libmagic1 \ rm -rf /var/lib/apt/lists/* # 从 builder 阶段复制已安装的包 COPY --frombuilder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY . . EXPOSE 8000 CMD [uvicorn, app.main:app, --host, 0.0.0.0, --port, 8000]为什么用多阶段构建构建阶段有编译器和构建工具运行时不需要。多阶段构建可以把镜像体积从 1.2GB 降到 400MB。前端 Dockerfile# frontend/Dockerfile FROM node:20-alpine AS builder WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npm run build FROM nginx:alpine COPY --frombuilder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD [nginx, -g, daemon off;]前端 nginx 配置# frontend/nginx.conf server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; location / { 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; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_read_timeout 120s; } }docker-compose 怎么编排所有服务完整编排文件# docker-compose.ymlservices:postgres:image:postgres:16-alpineenvironment:POSTGRES_DB:knowPOSTGRES_USER:knowPOSTGRES_PASSWORD:${DB_PASSWORD}volumes:-postgres_data:/var/lib/postgresql/datahealthcheck:test:[CMD-SHELL,pg_isready -U know]interval:10stimeout:5sretries:5redis:image:redis:7-alpinevolumes:-redis_data:/datahealthcheck:test:[CMD,redis-cli,ping]qdrant:image:qdrant/qdrant:latestvolumes:-qdrant_data:/qdrant/storageminio:image:minio/minio:latestenvironment:MINIO_ROOT_USER:${MINIO_USER}MINIO_ROOT_PASSWORD:${MINIO_PASSWORD}volumes:-minio_data:/datacommand:server /databackend:build:./backendenv_file:.envdepends_on:postgres:{condition:service_healthy}redis:{condition:service_healthy}qdrant:{condition:service_started}minio:{condition:service_started}frontend:build:./frontendports:-80:80depends_on:-backendvolumes:postgres_data:redis_data:qdrant_data:minio_data:环境变量模板# .env不要提交 GitDB_PASSWORDyour_secure_passwordMINIO_USERknow_adminMINIO_PASSWORDyour_minio_passwordLLM_API_KEYsk-your-keyLLM_BASE_URLhttps://api.deepseek.com/v1JWT_SECRETyour_random_secret_here一键部署# 克隆代码gitclone https://github.com/your/know.gitcdknow# 配置环境变量cp.env.example .env# 编辑 .env 填入真实密钥# 启动dockercompose up-d--build# 查看日志dockercompose logs-f# 更新gitpulldockercompose up-d--build上线前要做哪些安全检查1. 密钥检查# 不要把这些硬编码在代码里❌ JWT_SECRET123456❌ DB_PASSWORDpassword❌ API_KEYsk-test✅ 使用环境变量或密钥管理服务2. CORS 配置# 生产环境限制来源app.add_middleware(CORSMiddleware,allow_origins[https://your-domain.com],allow_methods[GET,POST],allow_headers[Authorization,Content-Type],)3. 速率限制# 防止 API 被滥用fromslowapiimportLimiter limiterLimiter(key_funcget_remote_address)app.state.limiterlimiterrouter.post(/api/chat/stream)limiter.limit(30/minute)asyncdefchat_stream():...4. 数据备份# 定时备份数据库03* * *dockerexecknow-postgres pg_dump-Uknow know/backup/know_$(date\%Y\%m\%d).sql# 保留最近 30 天04* * *find/backup-nameknow_*.sql-mtime30-delete上线 checklist□ 所有密码和密钥已修改不追求认密码 □ HTTPS 证书已配置 □ CORS 已限制域名 □ 速率限制已启用 □ 数据库备份已配置 □ 日志轮转已配置 □ Docker 镜像已优化多阶段构建 □ .env 文件未提交 Git □ 容器以非 root 用户运行 □ 健康检查接口已配置总结步骤做的事构建镜像多阶段构建前端用 nginx 托管静态文件编排服务docker-compose 管理 6 个服务安全加固CORS、限流、密钥管理、备份上线验证按 checklist 逐项确认本文是《AI 全栈开发实战——做一个真正的产品》系列的第 10 篇。系列目录1-9 已完成10. Docker 部署 ← 你在这里如果觉得有用欢迎点赞 收藏 关注。这个系列从产品定义写到生产上线全部代码开源可运行带你从零交付一个真正的 AI 产品。