以下是一个完整的 docker-compose.yml 配置文件,用于部署 PostgreSQL 17.6 和 Redis 8.0.5,并确保数据持久化保存:
version: '3.8'
services:
# PostgreSQL 17.6 服务
postgres:
image: postgres:17.6
container_name: postgres-17
restart: unless-stopped
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: StrongPassword123! # 请在生产环境中修改
POSTGRES_DB: mydatabase
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
# 数据持久化卷
- postgres_data:/var/lib/postgresql/data
# 初始化脚本目录(可选)
- ./postgres-init:/docker-entrypoint-initdb.d
ports:
- "5432:5432"
networks:
- app-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U admin"]
interval: 10s
timeout: 5s
retries: 5
command: >
postgres
-c max_connections=100
-c shared_buffers=256MB
-c effective_cache_size=1GB
# Redis 8.0.5 服务
redis:
image: redis:8.0.5-alpine
container_name: redis-8
restart: unless-stopped
command: >
redis-server
--requirepass RedisSecurePass123! # 请在生产环境中修改
--appendonly yes
--appendfsync everysec
--maxmemory 512mb
--maxmemory-policy allkeys-lru
volumes:
# 数据持久化卷
- redis_data:/data
# Redis 配置文件(可选)
- ./redis.conf:/usr/local/etc/redis/redis.conf
ports:
- "6379:6379"
networks:
- app-network
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
interval: 10s
timeout: 5s
retries: 5
# 自定义网络
networks:
app-network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
# 持久化数据卷定义
volumes:
postgres_data:
name: postgres_persistent_data
driver: local
driver_opts:
type: none
o: bind
device: ./data/postgres # 本地目录映射
redis_data:
name: redis_persistent_data
driver: local
driver_opts:
type: none
o: bind
device: ./data/redis # 本地目录映射
在运行前,建议创建以下目录结构:
your-project/
├── docker-compose.yml # 上面的配置文件
├── data/ # 数据目录(docker-compose.yml 自动创建)
│ ├── postgres/ # PostgreSQL 数据
│ └── redis/ # Redis 数据
├── postgres-init/ # (可选)PostgreSQL 初始化脚本
│ └── 01-init.sql # 初始化 SQL 脚本
└── redis.conf # (可选)Redis 自定义配置文件
🚀 快速开始
1. 启动服务
# 创建项目目录并进入
mkdir my-app && cd my-app
# 创建 docker-compose.yml 文件,粘贴上面的配置
# 启动服务(后台运行)
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f
2. 验证服务运行
# 检查 PostgreSQL
docker-compose exec postgres psql -U admin -d mydatabase -c "SELECT version();"
# 检查 Redis
docker-compose exec redis redis-cli -a RedisSecurePass123! ping
# 返回 "PONG" 表示成功
3. 管理命令
# 停止服务(保留数据)
docker-compose down
# 停止并删除所有数据
docker-compose down -v
# 重启特定服务
docker-compose restart postgres
# 查看资源使用情况
docker-compose stats
🔧 高级配置选项
PostgreSQL 性能调优(可选)
在 postgres-init/01-init.sql 中添加:
-- 创建额外数据库
CREATE DATABASE appdb;
-- 创建用户和权限
CREATE USER appuser WITH PASSWORD 'UserPass123';
GRANT ALL PRIVILEGES ON DATABASE appdb TO appuser;
-- 性能参数调整
ALTER SYSTEM SET work_mem = '16MB';
ALTER SYSTEM SET maintenance_work_mem = '128MB';
Redis 配置优化(可选)
# 连接设置
maxclients 10000
timeout 300
# 持久化策略
save 900 1
save 300 10
save 60 10000
# 内存管理
maxmemory-policy volatile-lru
# 安全设置
rename-command FLUSHDB ""
rename-command FLUSHALL ""
📊 数据持久化说明
PostgreSQL 数据位置
- 容器内路径: /var/lib/postgresql/data
- 宿主机路径: ./data/postgres(项目目录下)
- 备份方法:
# 备份数据库
docker-compose exec postgres pg_dump -U admin mydatabase > backup.sql
# 恢复数据库
cat backup.sql | docker-compose exec -T postgres psql -U admin mydatabase
Redis 数据位置
- 容器内路径: /data
- 宿主机路径: ./data/redis(项目目录下)
- 数据文件: appendonly.aof(AOF 持久化文件)
- 备份方法:
# 创建 RDB 快照
docker-compose exec redis redis-cli -a RedisSecurePass123! SAVE
# 复制数据文件
cp ./data/redis/appendonly.aof ./backup/
🛡️ 安全注意事项
- 网络暴露
# 生产环境建议移除 ports 暴露,或限制 IP 访问
ports:
- "127.0.0.1:5432:5432" # 仅本地访问
# 或使用内部网络,不暴露端口
# ports: [] # 不暴露端口,仅容器间访问
- 环境变量管理
# 创建 .env 文件(不要提交到版本控制)
POSTGRES_PASSWORD=你的强密码
REDIS_PASSWORD=你的强密码
然后在 docker-compose.yml 中引用:
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
command: >
redis-server
--requirepass ${REDIS_PASSWORD}
🔍 故障排查
- 常见问题:
- 端口冲突:
# 检查端口占用
netstat -tulpn | grep :5432
# 或修改 docker-compose.yml 中的端口映射
ports:
- "5433:5432" # 外部:内部
- 权限问题:
# 确保本地数据目录有正确权限
chmod 755 ./data
- 服务启动失败:
# 查看详细日志
docker-compose logs postgres
docker-compose logs redis
# 尝试重新构建
docker-compose down -v
docker-compose up -d --build
- 监控命令:
# 查看服务状态
docker-compose ps
# 实时日志
docker-compose logs -f --tail=50
# 资源使用
docker-compose top
# 进入容器检查
docker-compose exec postgres bash
docker-compose exec redis redis-cli -a RedisSecurePass123! INFO
📝 版本信息验证
部署完成后,验证版本:
# PostgreSQL 版本
docker-compose exec postgres postgres --version
# 输出:postgres (PostgreSQL) 17.6
# Redis 版本
docker-compose exec redis redis-server --version
# 输出:Redis server v=8.0.5 sha=...

评论