by-crm/docs/docker-deployment.md
2026-01-26 16:45:05 +08:00

6.2 KiB
Raw Blame History

Docker 部署指南

项目架构

本项目采用前后端分离架构,使用 Docker Compose 进行编排部署。

服务说明

  • crm-frontend: 前端服务Nginx端口 80
  • crm-backend: 后端服务Spring Boot端口 8080
  • crm-mysql: MySQL 8 数据库,端口 3306

网络架构

Internet
   │
   ▼
Nginx (crm-frontend:80)
   │
   ├─► 静态文件 (Vue SPA)
   │
   └─► /api/* 代理到 Spring Boot (crm-backend:8080)
           │
           └─► MySQL (crm-mysql:3306)

快速开始

1. 准备工作

确保已安装以下软件:

  • Docker (20.10+)
  • Docker Compose (2.0+)

检查安装:

docker --version
docker-compose --version

2. 配置环境变量

编辑 docker-compose.yml,根据需要修改以下配置:

数据库配置:

environment:
  MYSQL_ROOT_PASSWORD: MySQL123s56  # 修改为强密码
  MYSQL_DATABASE: crm_db

后端配置:

environment:
  JWT_SECRET: your-secret-key-change-in-production  # 修改为随机密钥
  JWT_EXPIRATION: 86400000
  SPRING_DATASOURCE_PASSWORD: MySQL123s56  # 与数据库密码一致

3. 构建并启动

# 进入项目根目录
cd by-crm

# 构建并启动所有服务(后台运行)
docker-compose up -d

# 查看日志
docker-compose logs -f

# 查看服务状态
docker-compose ps

4. 访问应用

常用命令

服务管理

# 启动所有服务
docker-compose up -d

# 停止所有服务
docker-compose stop

# 重启所有服务
docker-compose restart

# 停止并删除容器
docker-compose down

# 停止并删除容器、网络、数据卷
docker-compose down -v

查看日志

# 查看所有服务日志
docker-compose logs -f

# 查看特定服务日志
docker-compose logs -f crm-backend
docker-compose logs -f crm-frontend
docker-compose logs -f crm-mysql

# 查看最近 100 行日志
docker-compose logs --tail=100 crm-backend

重新构建

# 重新构建并启动
docker-compose up -d --build

# 重新构建特定服务
docker-compose build crm-backend
docker-compose build crm-frontend

进入容器

# 进入后端容器
docker-compose exec crm-backend sh

# 进入数据库容器
docker-compose exec crm-mysql mysql -uroot -p

# 进入前端容器
docker-compose exec crm-frontend sh

数据持久化

数据卷挂载

# MySQL 数据
./mysql/data:/var/lib/mysql

# 后端日志
./backend/logs:/app/logs

备份数据库

# 导出数据库
docker-compose exec crm-mysql mysqldump -uroot -pMySQL123s56 crm_db > backup.sql

# 导入数据库
docker-compose exec -T crm-mysql mysql -uroot -pMySQL123s56 crm_db < backup.sql

生产环境部署

1. 修改端口映射

根据实际情况修改端口映射:

services:
  crm-frontend:
    ports:
      - "80:80"  # 或者使用 443:443 (HTTPS)

  crm-backend:
    ports:
      - "8080:8080"  # 生产环境建议不对外暴露,仅通过 Nginx 访问

  crm-mysql:
    ports:
      - "3306:3306"  # 生产环境建议注释掉,不对外暴露

2. 配置 HTTPS推荐

修改 frontend/nginx.conf

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    # 其他配置...
}

# HTTP 重定向到 HTTPS
server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$server_name$request_uri;
}

挂载 SSL 证书:

crm-frontend:
  volumes:
    - ./ssl:/etc/nginx/ssl:ro
  ports:
    - "443:443"
    - "80:80"

3. 优化配置

后端 JVM 参数backend/Dockerfile

ENTRYPOINT ["java", \
  "-Xms512m", \
  "-Xmx1024m", \
  "-XX:+UseG1GC", \
  "-jar", "app.jar"]

MySQL 优化docker-compose.yml

crm-mysql:
  command: [
    '--default-authentication-plugin=mysql_native_password',
    '--character-set-server=utf8mb4',
    '--collation-server=utf8mb4_unicode_ci',
    '--max_connections=500',
    '--innodb_buffer_pool_size=1G'
  ]

4. 安全加固

  • 修改所有默认密码
  • 使用强密码策略
  • 配置防火墙规则
  • 启用 HTTPS
  • 定期备份数据
  • 限制数据库访问(不对外暴露 3306 端口)

故障排查

容器启动失败

# 查看详细日志
docker-compose logs crm-backend

# 检查容器状态
docker-compose ps

# 检查网络
docker network ls
docker network inspect by-crm_crm_network

数据库连接失败

# 等待数据库健康检查通过
docker-compose logs crm-mysql

# 检查数据库是否就绪
docker-compose exec crm-mysql mysql -uroot -pMySQL123s56 -e "SHOW DATABASES;"

前端访问后端跨域

检查 frontend/nginx.conf 中的代理配置:

location /api/ {
    proxy_pass http://crm-backend:8080/api/;
    # 确保包含这些头
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

性能监控

# 查看容器资源使用
docker stats

# 查看特定服务资源使用
docker stats crm-backend crm-frontend crm-mysql

升级部署

# 1. 备份数据
docker-compose exec crm-mysql mysqldump -uroot -pMySQL123s56 crm_db > backup_$(date +%Y%m%d).sql

# 2. 拉取最新代码
git pull

# 3. 重新构建并启动
docker-compose up -d --build

# 4. 清理旧镜像
docker image prune -f

注意事项

  1. 首次启动:数据库初始化可能需要 1-2 分钟,请耐心等待
  2. 健康检查:后端服务依赖数据库健康检查通过后才会启动
  3. 数据安全:生产环境务必修改默认密码
  4. 资源限制可根据服务器配置添加资源限制cpus、memory
  5. 日志管理:建议配置日志轮转,避免磁盘占满

参考资源