Docker 部署
CmdAdmin 支持 Docker 容器化部署,方便快速部署和环境隔离。
快速开始
使用 Docker Compose(推荐)
bash
# 克隆项目
git clone https://github.com/key1012/cmdadmin.git
cd cmdadmin
# 启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -fDocker 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: bridgeDockerfile
后端 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_HOST | Redis 主机 | redis |
| SPRING_REDIS_PORT | Redis 端口 | 6379 |
| SPRING_REDIS_PASSWORD | Redis 密码 | - |
| JWT_SECRET | JWT 密钥 | - |
| LOG_LEVEL | 日志级别 | INFO |
使用 .env 文件
bash
# .env 文件
DB_PASSWORD=your_secure_password
REDIS_PASSWORD=your_redis_password
JWT_SECRET=your_jwt_secret_keyyaml
# 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 lsKubernetes 部署
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