一、Docker Compose 配置优化

1.1 最终版配置

version: '3.8'

services:
  postgres:
    image: postgres:16-alpine
    container_name: postgres  # 标准容器命名
    restart: unless-stopped
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}  # 通过.env文件注入
      - POSTGRES_DB=test
      - POSTGRES_HOST_AUTH_METHOD=md5
      - TZ=Asia/Shanghai
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - postgres-net
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 10

volumes:
  postgres_data:

networks:
  postgres-net:
    driver: bridge

1.2 关键配置说明

  1. 安全增强

    • 使用 .env 文件管理敏感信息:
      echo "POSTGRES_PASSWORD=$(openssl rand -base64 16)" > .env
      
    • 强制密码认证(md5
  2. 数据持久化

    • 命名卷 postgres_data 保障数据安全
    • 查看数据卷位置:
      docker volume inspect pqsql_postgres_data
      
  3. 健康检查

    • 自动检测数据库就绪状态
    • 其他服务可通过 condition: service_healthy 依赖检测

二、常用 Docker 运维命令

2.1 容器生命周期

操作命令
启动服务docker compose up -d
停止容器docker stop postgres
删除容器docker rm -f postgres
查看日志docker logs -f postgres

2.2 数据管理

# 全库备份
docker exec -t postgres pg_dumpall -U postgres > backup_$(date +%F).sql

# 单库恢复
cat backup.sql | docker exec -i postgres psql -U postgres

2.3 监控调试

# 查看资源占用
docker stats postgres

# 进入容器Shell
docker exec -it postgres sh

三、PostgreSQL 核心操作指南

3.1 快速接入数据库

# 直接进入PSQL
docker exec -it postgres psql -U postgres -d test

3.2 常用元命令速查

命令说明
\l列出所有数据库
\c 数据库名字进入数据库
\dt显示当前库所有表
\d+ 表名查看表结构详情
\x切换宽表显示模式
\timing开启SQL执行计时

3.3 高频SQL操作

-- 创建只读用户
CREATE USER viewer WITH PASSWORD 'securePass123!';
GRANT CONNECT ON DATABASE test TO viewer;
GRANT USAGE ON SCHEMA public TO viewer;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO viewer;

-- 查询性能分析
EXPLAIN ANALYZE SELECT * FROM large_table WHERE create_date > '2023-01-01';

四、生产环境建议

4.1 安全加固

  1. 禁用默认超级用户:
    ALTER USER postgres WITH NOLOGIN;
    
  2. 定期轮换密码:
    ALTER USER app_user WITH PASSWORD 'newSecurePass!';
    

4.2 备份策略

# 每日压缩备份(保留30天)
docker exec -t postgres pg_dumpall -U postgres | gzip > pg_$(date +%Y%m%d).sql.gz
find . -name "pg_*.sql.gz" -mtime +30 -delete

4.3 资源限制

# 在docker-compose.yml中添加
deploy:
  resources:
    limits:
      memory: 4G
      cpus: '2.0'

五、故障排查工具箱

5.1 连接问题诊断

# 检查端口映射
docker port postgres

# 测试认证配置
docker exec -it postgres psql -U test_user -d test

5.2 日志分析技巧

# 筛选错误日志
docker logs postgres 2>&1 | grep -i -E 'error|fail'

# 实时监控慢查询
docker logs -f postgres | grep 'duration:'

结语

本文提供了一套开箱即用的 PostgreSQL 容器化部署方案,涵盖从基础配置到生产级优化的全流程。通过标准化容器命名(postgres)和模块化设计,既保证了易用性,又为系统扩展预留了空间。建议根据实际业务需求:

  1. 调整自动备份策略
  2. 配置监控告警(推荐 Prometheus + Grafana)
  3. 定期进行恢复演练