Skip to content

Docker 部署

CmdAdmin 支持 Docker 容器化部署,方便快速部署和环境隔离。

快速开始

使用 Docker Compose(推荐)

bash
# 克隆项目
git clone https://github.com/key1012/cmdadmin.git
cd cmdadmin

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

# 查看日志
docker-compose logs -f

Docker Compose 配置

完整配置

yaml
version: '3.8'

services:
  # 后端服务
  backend:
    build: .
    container_name: cmdadmin-backend
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/cmdadmin
      - SPRING_DATASOURCE_USERNAME=cmdadmin
      - SPRING_DATASOURCE_PASSWORD=cmdadmin123
      - SPRING_REDIS_HOST=redis
      - SPRING_REDIS_PORT=6379
    depends_on:
      - postgres
      - redis
    networks:
      - cmdadmin-network
    restart: unless-stopped

  # 前端服务
  frontend:
    build: ./admin-web
    container_name: cmdadmin-frontend
    ports:
      - "80:80"
    depends_on:
      - backend
    networks:
      - cmdadmin-network
    restart: unless-stopped

  # PostgreSQL 数据库
  postgres:
    image: postgres:15-alpine
    container_name: cmdadmin-postgres
    environment:
      - POSTGRES_DB=cmdadmin
      - POSTGRES_USER=cmdadmin
      - POSTGRES_PASSWORD=cmdadmin123
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./src/main/resources/db/schema-postgresql.sql:/docker-entrypoint-initdb.d/01-schema.sql
      - ./src/main/resources/db/data-postgresql.sql:/docker-entrypoint-initdb.d/02-data.sql
    ports:
      - "5432:5432"
    networks:
      - cmdadmin-network
    restart: unless-stopped

  # Redis 缓存
  redis:
    image: redis:7-alpine
    container_name: cmdadmin-redis
    volumes:
      - redis_data:/data
    ports:
      - "6379:6379"
    networks:
      - cmdadmin-network
    restart: unless-stopped

volumes:
  postgres_data:
  redis_data:

networks:
  cmdadmin-network:
    driver: bridge

Dockerfile

后端 Dockerfile

dockerfile
# 构建阶段
FROM eclipse-temurin:21-jdk-alpine AS builder

WORKDIR /app
COPY . .
RUN ./mvnw clean package -DskipTests

# 运行阶段
FROM eclipse-temurin:21-jre-alpine

WORKDIR /app

# 创建非 root 用户
RUN addgroup -S cmdadmin && adduser -S cmdadmin -G cmdadmin

# 复制构建产物
COPY --from=builder /app/target/*.jar app.jar

# 设置权限
RUN chown -R cmdadmin:cmdadmin /app
USER cmdadmin

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=60s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:8080/api/actuator/health || exit 1

EXPOSE 8080

ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]

前端 Dockerfile

dockerfile
# 构建阶段
FROM node:20-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm install

COPY . .
RUN npm run build

# 运行阶段
FROM nginx:alpine

# 复制构建产物
COPY --from=builder /app/dist /usr/share/nginx/html

# 复制 Nginx 配置
COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

Nginx 配置

nginx
server {
    listen 80;
    server_name localhost;
    
    location / {
        root /usr/share/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
    
    location /api {
        proxy_pass http://backend:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    
    client_max_body_size 100M;
}

常用命令

启动服务

bash
# 后台启动
docker-compose up -d

# 前台启动(查看日志)
docker-compose up

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

停止服务

bash
# 停止服务
docker-compose stop

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

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

查看日志

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

# 查看指定服务日志
docker-compose logs -f backend

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

进入容器

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

# 进入数据库容器
docker-compose exec postgres psql -U cmdadmin -d cmdadmin

# 进入 Redis 容器
docker-compose exec redis redis-cli

数据持久化

数据卷管理

bash
# 列出数据卷
docker volume ls

# 查看数据卷详情
docker volume inspect cmdadmin_postgres_data

# 备份数据卷
docker run --rm -v cmdadmin_postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres_backup.tar.gz -C /data .

# 恢复数据卷
docker run --rm -v cmdadmin_postgres_data:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/postgres_backup.tar.gz"

数据库备份

bash
# 创建备份脚本
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
docker-compose exec -T postgres pg_dump -U cmdadmin cmdadmin > backup_$DATE.sql

环境变量

后端环境变量

变量名说明默认值
SPRING_PROFILES_ACTIVE激活的配置文件prod
SERVER_PORT服务端口8080
SPRING_DATASOURCE_URL数据库连接URL-
SPRING_DATASOURCE_USERNAME数据库用户名-
SPRING_DATASOURCE_PASSWORD数据库密码-
SPRING_REDIS_HOSTRedis 主机redis
SPRING_REDIS_PORTRedis 端口6379
SPRING_REDIS_PASSWORDRedis 密码-
JWT_SECRETJWT 密钥-
LOG_LEVEL日志级别INFO

使用 .env 文件

bash
# .env 文件
DB_PASSWORD=your_secure_password
REDIS_PASSWORD=your_redis_password
JWT_SECRET=your_jwt_secret_key
yaml
# docker-compose.yml
services:
  backend:
    environment:
      - SPRING_DATASOURCE_PASSWORD=${DB_PASSWORD}
      - JWT_SECRET=${JWT_SECRET}

多环境部署

开发环境

bash
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

测试环境

bash
docker-compose -f docker-compose.yml -f docker-compose.test.yml up -d

生产环境

bash
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

集群部署(Swarm)

初始化 Swarm

bash
docker swarm init

部署栈

bash
docker stack deploy -c docker-compose.yml cmdadmin

查看服务

bash
docker stack ps cmdadmin
docker service ls

Kubernetes 部署

Deployment 配置

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cmdadmin-backend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: cmdadmin-backend
  template:
    metadata:
      labels:
        app: cmdadmin-backend
    spec:
      containers:
        - name: backend
          image: cmdadmin/backend:latest
          ports:
            - containerPort: 8080
          env:
            - name: SPRING_PROFILES_ACTIVE
              value: "prod"

Service 配置

yaml
apiVersion: v1
kind: Service
metadata:
  name: cmdadmin-backend
spec:
  selector:
    app: cmdadmin-backend
  ports:
    - port: 8080
      targetPort: 8080
  type: ClusterIP

监控与维护

资源限制

yaml
services:
  backend:
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 2G
        reservations:
          cpus: '0.5'
          memory: 1G

自动重启

yaml
services:
  backend:
    restart: unless-stopped
    # 或
    restart: always
    # 或
    restart: on-failure:3

故障排查

容器无法启动

bash
# 查看容器日志
docker-compose logs backend

# 检查容器状态
docker-compose ps

# 检查资源使用
docker stats

数据库连接失败

bash
# 检查网络连接
docker-compose exec backend ping postgres

# 检查数据库日志
docker-compose logs postgres

清理资源

bash
# 删除未使用的容器
docker container prune

# 删除未使用的镜像
docker image prune

# 删除未使用的数据卷
docker volume prune

# 清理所有
docker system prune -a

基于 MIT 许可发布