PostgreSQL Docker 部署指南
简介
PostgreSQL 是目前功能最强大的开源关系型数据库之一,以其稳定性、功能丰富性和对 SQL 标准的严格遵守而著称。
主要特性
- ACID 事务:完整的事务支持
- MVCC:多版本并发控制
- 丰富的数据类型:支持 JSON、数组、范围类型等
- 扩展性:通过 PL/pgSQL、Python、Perl 等扩展
- 高可用:支持流复制、物理/逻辑复制
快速开始
Docker Run 方式
# 最简启动
docker run -d --name postgres -e POSTGRES_PASSWORD=secret postgres:16-alpine
# 自定义配置
docker run -d --name postgres \
-p 5432:5432 \
-e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=mydb \
-v pgdata:/var/lib/postgresql/data \
postgres:16-alpine
# 连接数据库
docker exec -it postgres psql -U admin -d mydb
Docker Compose 方式
环境变量说明
| 变量名 | 描述 | 默认值 | 是否必填 |
|---|---|---|---|
POSTGRES_USER |
超级用户名 | postgres | 否(建议设置) |
POSTGRES_PASSWORD |
超级用户密码 | - | 是 |
POSTGRES_DB |
默认数据库名 | POSTGRES_USER | 否 |
PGDATA |
数据目录 | /var/lib/postgresql/data | 否 |
POSTGRES_INITDB_ARGS |
initdb 参数 | - | 否 |
持久化存储
重要:PostgreSQL 数据必须持久化,容器重建会丢失数据!
# 创建数据卷
docker volume create pgdata
# 使用数据卷
docker run -d -v pgdata:/var/lib/postgresql/data postgres
初始化脚本
可以将 SQL 初始化脚本放入 docker-entrypoint-initdb.d/ 目录:
# 创建初始化脚本
mkdir init
cat > init/01-init.sql << 'EOF'
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO users (username, email) VALUES ('admin', 'admin@example.com');
EOF
# 挂载初始化脚本
docker run -v ./init:/docker-entrypoint-initdb.d/ postgres
性能调优参数
生产环境推荐的配置:
| 参数 | 小型服务器 | 中型服务器 | 大型服务器 |
|---|---|---|---|
shared_buffers |
128MB | 256MB-512MB | 1GB+ |
effective_cache_size |
512MB | 1GB-2GB | 4GB+ |
max_connections |
100 | 100-200 | 200 |
work_mem |
4MB | 8MB | 16MB |
maintenance_work_mem |
64MB | 128MB | 256MB |
常用管理命令
# 进入容器
docker exec -it postgres bash
# 连接 psql
docker exec -it postgres psql -U admin
# 备份数据库
docker exec postgres pg_dump -U admin mydb > backup.sql
# 恢复数据库
cat backup.sql | docker exec -i postgres psql -U admin mydb
# 查看数据库大小
SELECT pg_size_pretty(pg_database_size('mydb'));
# 查看活动连接
SELECT * FROM pg_stat_activity;
高可用配置
生产环境建议配置:
- 主从复制:流复制或逻辑复制
- 定期备份:自动化 pg_dump 或 base backup
- 监控:使用 pg_stat_statements、Prometheus
- 连接池:使用 PgBouncer
安全建议
- 使用复杂密码
- 配置
.pgpass文件管理凭据 - 限制网络访问(pg_hba.conf)
- 启用 SSL/TLS 加密
- 定期更新 PostgreSQL 版本