Docker 中安装 PostgreSQL 16

一、环境准备

1. 确认 Docker 版本
bash 复制代码
docker --version
# Docker version 28.3.3, build 980b856
# 如版本低于27.0,请先升级
2. 创建专用网络(生产环境必备)
lua 复制代码
docker network create pg-network

作用

  • 隔离数据库流量
  • 避免端口冲突
  • 方便后续扩展(如连接应用容器)

二、PostgreSQL 16 容器化部署

1. 搜索镜像
sql 复制代码
docker search postgres
2. 拉取官方镜像(指定版本)
复制代码
docker pull postgres:16
3. 创建持久化数据卷
lua 复制代码
docker volume create pgdata

生产环境重要性

  • 容器重启/删除时数据不丢失
  • 独立于容器生命周期管理
  • 方便备份迁移
4. 启动 PostgreSQL 容器(生产优化版)
ini 复制代码
docker run -d \
  --name postgres \
  --network pg-network \
  -p 5432:5432 \
  -e POSTGRES_PASSWORD=123456 \
  -e POSTGRES_USER=ahjmkj \
  -e POSTGRES_DB=openAgent \
  -e TZ=Asia/Shanghai \
  -e POSTGRES_INITDB_ARGS="--data-checksums" \
  -v pgdata:/var/lib/postgresql/data \
  -v /etc/localtime:/etc/localtime:ro \
  --restart=unless-stopped \
  --memory=4g \
  --cpus=2 \
  --health-cmd="pg_isready -U ahjmkj" \
  --health-interval=30s \
  --health-timeout=5s \
  --health-retries=3 \
  postgres:16 \
  -c max_connections=200 \
  -c shared_buffers=1GB

参数详解:

参数 说明 生产环境重要性 --network pg-network 加入专用网络 ⭐⭐⭐⭐⭐ 网络安全隔离

-e POSTGRES_PASSWORD 管理员密码 ⭐⭐⭐⭐⭐ 必须使用强密码

-e TZ=Asia/Shanghai 设置时区 ⭐⭐⭐⭐ 避免时间相关错误

-v pgdata:/var/... 挂载数据卷 ⭐⭐⭐⭐⭐ 数据持久化

--restart=unless-stopped 自动重启策略 ⭐⭐⭐⭐ 高可用保障

--memory=4g --cpus=2 资源限制 ⭐⭐⭐⭐ 防止单容器耗尽资源

--health-cmd 健康检查 ⭐⭐⭐ 自动故障检测

-c max_connections=200 最大连接数 ⭐⭐⭐ 根据业务需求调整

-c shared_buffers=1GB 共享内存大小 ⭐⭐⭐ 性能优化关键参数

三、验证与连接

1. 检查容器状态
swift 复制代码
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"

输出:
CONTAINER ID  NAMES          STATUS                    PORTS
a1b2c3d4e5f6  prod-postgres  Up 2 minutes (healthy)   0.0.0.0:5432->5432/tcp
2. 查看实时日志
arduino 复制代码
docker logs -f postgres

输出:
PostgreSQL init process complete; ready for start up
database system is ready to accept connections
3. 命令行连接测试
csharp 复制代码
docker exec -it postgres \
  psql -U ahjmkj -d openAgent -c "SELECT version();"

输出:
PostgreSQL 16.3 on x86_64-pc-linux-gnu, compiled by gcc...
4. 客户端工具连接

使用 DBeaver/pgAdmin 连接:

  • Host: 服务器IP
  • Port: 5432
  • Database: openAgent
  • Username: ahjmkj
  • Password: 123456

四、生产环境高级配置

1. 配置文件自定义
bash 复制代码
# 创建配置目录
mkdir -p /docker/pg-config

# 生成默认配置
docker run --rm postgres:16 \
  cat /usr/share/postgresql/postgresql.conf.sample > /docker/pg-config/postgresql.conf

# 编辑配置文件(优化关键参数)
nano /docker/pg-config/postgresql.conf

关键参数建议

ini 复制代码
listen_addresses = '*'  # 允许所有网络接口
max_connections = 250   # 根据实际负载调整
shared_buffers = 1GB    # 建议分配内存的25%
work_mem = 16MB         # 每个操作的内存
maintenance_work_mem = 512MB  # 维护操作内存
synchronous_commit = off  # 异步提交提升性能

重新启动容器

arduino 复制代码
docker run ... \
  -v /docker/pg-config/postgresql.conf:/etc/postgresql/postgresql.conf \
  postgres:16 -c 'config_file=/etc/postgresql/postgresql.conf'
2. 定期备份方案

创建备份脚本 (pg-backup.sh):

bash 复制代码
#!/bin/bash
BACKUP_DIR=/backups/pg
DATE=$(date +%Y%m%d_%H%M%S)

docker exec prod-postgres \
  pg_dump -U ahjmkj -Fc openAgent > $BACKUP_DIR/prod_db_$DATE.dump

# 保留最近7天备份
find $BACKUP_DIR -mtime +7 -delete

设置定时任务: crontab -e

每天凌晨2点备份

javascript 复制代码
0 2 * * * /path/to/pg-backup.sh
3. 监控配置

使用内置统计收集器:

ini 复制代码
ALTER SYSTEM SET track_activities = on;
ALTER SYSTEM SET track_counts = on;
ALTER SYSTEM SET track_io_timing = on;
SELECT pg_reload_conf();

推荐监控工具:

  • Prometheus + Grafana(配合 postgres_exporter)
  • pgAdmin 4 监控面板
  • Datadog / New Relic

五、故障排查与维护

1. 常见问题解决

问题1:端口冲突

yaml 复制代码
# 检查占用5432端口的进程
sudo lsof -i :5432

# 解决方案:改用其他端口
docker run ... -p 5433:5432 ...

问题2:忘记管理员密码

bash 复制代码
# 进入容器bash
docker exec -it postgres bash

# 以postgres用户连接
psql -U postgres

# 重置密码
ALTER USER ahjmkj WITH PASSWORD '123456';

问题3:磁盘空间不足

perl 复制代码
# 查看容器磁盘使用
docker system df

# 清理无用容器/镜像
docker system prune -f

# 扩展数据卷
docker volume inspect pgdata # 找到实际路径
# 然后扩展对应磁盘分区
2. 关键维护命令

查看资源使用

复制代码
docker stats postgres

进入维护模式

bash 复制代码
docker exec -it postgres bash
psql -U ahjmkj -d openAgent

日志分析

css 复制代码
docker logs --tail 100 postgres | grep -i error

六、安全加固建议

  1. 网络层安全
ini 复制代码
# 限制访问IP(仅允许应用服务器)
docker network create --subnet=10.1.0.0/16 pg-secure-network
  1. SSL加密连接
ini 复制代码
# 启动容器时添加SSL参数
-e POSTGRES_SSL=on \
-e POSTGRES_SSL_CERT_FILE=/etc/ssl/certs/server.crt \
-e POSTGRES_SSL_KEY_FILE=/etc/ssl/private/server.key
  1. 定期轮换凭证
sql 复制代码
# 每月更新密码
ALTER USER ahjmkj WITH PASSWORD 'NewP@ssw0rd_$(date +%Y%m)';
  1. 审计日志
ini 复制代码
ALTER SYSTEM SET log_statement = 'all';
SELECT pg_reload_conf();
相关推荐
倒流时光三十年4 小时前
SpringBoot 数据库同步 Elasticsearch 性能优化
数据库·spring boot·elasticsearch
码农小卡拉4 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
怣504 小时前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
wjhx5 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
冰暮流星5 小时前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发5 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐6 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly6 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客6 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.6 小时前
MYSQL--- 聚合查询,分组查询和联合查询
数据库