九块记账(Docker-Compose)完整部署教程
2025-07-07
55
参考资料
九块记账(Docker-Compose)完整部署教程
以下是一个详细且包含示例说明的九块记账(Docker-Compose)部署教程,包含数据库独立部署和完整配置说明:
九块记账(Docker-Compose)完整部署教程
一、基础架构说明
[九块记账系统架构] 应用容器 (jiukuai-app:8080) ←─→ 数据库容器 (mysql:3306) ↑ ↑ 宿主机8080端口 宿主机3306端口
二、完整部署示例
1. 创建项目目录结构
mkdir -p jiukuai/{app,db,config,backup} tree jiukuai
输出示例:
jiukuai ├── app │ └── data # 应用数据持久化 ├── db │ ├── data # 数据库文件 │ └── init.sql # 初始化脚本 ├── config # 配置文件 └── backup # 备份目录
2. 数据库部署 (db/docker-compose.yml)
version: '3.8' services: mysql: image: mysql:8.0.33 container_name: jiukuai_db environment: MYSQL_ROOT_PASSWORD: "Jiuk@ai!2023R00t" # 示例密码,实际需更改 MYSQL_DATABASE: jiukuai_prod MYSQL_USER: jiukuai_user MYSQL_PASSWORD: "JiuK@ai!2023Db" volumes: - ./data:/var/lib/mysql - ./init.sql:/docker-entrypoint-initdb.d/init.sql - ./my.cnf:/etc/mysql/conf.d/my.cnf ports: - "3306:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 3 networks: - jiukuai_net networks: jiukuai_net: driver: bridge
3. 数据库配置文件 (db/my.cnf)
[mysqld] max_connections = 500 innodb_buffer_pool_size = 512M character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci default-authentication-plugin = mysql_native_password skip-name-resolve [client] default-character-set = utf8mb4
4. 数据库初始化脚本 (db/init.sql)
-- 创建专用账户(与docker-compose中的分开) CREATE USER IF NOT EXISTS 'jiukuai_app'@'%' IDENTIFIED BY 'App@Jiukai!2023'; GRANT ALL PRIVILEGES ON jiukuai_prod.* TO 'jiukuai_app'@'%'; FLUSH PRIVILEGES; -- 创建核心表(示例) CREATE TABLE IF NOT EXISTS `accounts` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, `balance` DECIMAL(15,2) DEFAULT 0.00, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
5. 应用部署 (app/docker-compose.yml)
version: '3.8' services: jiukuai: image: jiukuai/accounting:2.1.0 # 替换为实际镜像 container_name: jiukuai_web environment: - DB_HOST=jiukuai_db - DB_PORT=3306 - DB_NAME=jiukuai_prod - DB_USER=jiukuai_app - DB_PASSWORD=App@Jiukai!2023 - APP_PORT=8080 - TZ=Asia/Shanghai volumes: - ./data:/app/storage - ../config:/app/config ports: - "8080:8080" depends_on: mysql: condition: service_healthy networks: - jiukuai_net restart: unless-stopped networks: jiukuai_net: external: true
6. 启动流程
# 1. 先启动数据库 cd jiukuai/db docker-compose up -d # 等待数据库初始化完成(约1-2分钟) docker logs jiukuai_db --tail 50 # 2. 启动应用 cd ../app docker-compose up -d # 查看应用日志 docker logs jiukuai_web --follow
三、配置详解
1. 数据库连接配置
# 连接池配置示例(在应用环境变量中添加) DB_POOL_MAX_ACTIVE=20 DB_POOL_MAX_IDLE=10 DB_POOL_MIN_IDLE=5 DB_POOL_MAX_WAIT=30000
2. 健康检查端点
应用应暴露健康检查接口:
curl http://localhost:8080/health
期望响应:
{ "status": "UP", "db": { "status": "UP", "latency": 45 } }
3. 备份方案
创建 backup/backup.sh
:
#!/bin/bash DATE=$(date +%Y%m%d) BACKUP_FILE="/backup/jiukuai_db_$DATE.sql.gz" docker exec jiukuai_db mysqldump \ -u root \ -p"Jiuk@ai!2023R00t" \ --single-transaction \ --routines \ --triggers \ jiukuai_prod | gzip > $BACKUP_FILE # 保留最近7天备份 find /backup -name "*.sql.gz" -mtime +7 -delete
添加到crontab:
0 3 * * * /path/to/backup.sh
四、常见问题解决
1. 连接超时问题
ERROR: JDBC Connection Exception: Connection timed out
解决方案:
# 在应用环境变量中添加 DB_CONNECTION_TIMEOUT: "30000" DB_SOCKET_TIMEOUT: "60000"
2. 字符集问题
Incorrect string value: '\xE4\xB8\xAD\xE6\x96\x87'
确保数据库配置包含:
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
3. 性能优化建议
# 数据库服务添加资源限制 deploy: resources: limits: cpus: '2' memory: 2G reservations: memory: 1G
五、升级流程示例
# 1. 备份数据库 ./backup.sh # 2. 停止旧应用 docker stop jiukuai_web # 3. 更新镜像 docker pull jiukuai/accounting:2.2.0 # 4. 修改docker-compose.yml中的版本号 sed -i 's/2.1.0/2.2.0/g' app/docker-compose.yml # 5. 启动新版本 docker-compose up -d
六、监控配置(可选)
在docker-compose中添加Prometheus监控:
services: jiukuai: # ...原有配置... labels: - "prometheus.enable=true" - "prometheus.port=8081" - "prometheus.path=/metrics"
这个部署方案具有以下特点:
完全分离的数据库容器
数据持久化配置
健康检查机制
自动备份方案
完整的配置示例
故障排查指南
实际部署时,请务必:
替换所有示例密码
根据实际服务器资源调整配置参数
在测试环境验证后再上生产