docker部署postgresql17,并且安装插件

前言

最近在研究迁移Oracle的问题。同时公司也有数据分析(OLAP)、国产化等等需求,最后选型了postgres数据库。此文总结了个人这两天的探索。

docker-compose.yml

yml 复制代码
services:
  postgres17:
    image: postgres:17.5
    container_name: postgres17
    restart: always
    privileged: true
    network_mode: host  # 启用host网络模式
    environment:
      POSTGRES_USER: postgres # 默认用户名
      POSTGRES_PASSWORD: passwd # 默认密码
      POSTGRES_DB: postgres # 初始化默认创建的Schema,不配置则默认等于POSTGRES_USER
      PGDATA: /var/lib/postgresql/data # 数据挂载目录
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
    volumes:
      - postgres17-data:/var/lib/postgresql/data
      - ./pg_data/backups:/backups
      - ./pg_data/config/postgresql.conf:/etc/postgresql.conf
    command: ["postgres", "-c", "config_file=/etc/postgresql.conf"]

  pgadmin4:
    image: dpage/pgadmin4:9.4
    container_name: pgadmin4
    restart: unless-stopped
    environment:
      - PGADMIN_DEFAULT_EMAIL=pgadmin4@postgres.com
      - PGADMIN_DEFAULT_PASSWORD=pgadmin4
      - PGADMIN_DISABLE_POSTFIX=false
      - PGADMIN_LISTEN_PORT=5431
    ports:
      - '5431:5431'
    volumes:
      - ./pgadmin_data:/var/lib/pgadmin

  cloudbeaver:
    image: dbeaver/cloudbeaver:25.1
    container_name: cloudbeaver25
    ports:
      - "5430:8978"
    environment:
      - JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Duser.language=zh -Duser.country=CN
    volumes:
      - ./cb_data/workspace:/opt/cloudbeaver/workspace
      # 驱动可以自定义,例如支持达梦等等,需要把容器内部驱动复制出来才能挂载目录
      # - ./cb_data/drivers:/opt/cloudbeaver/drivers

volumes:
  # 定义命名卷
  postgres17-data:

postgresql.conf

conf 复制代码
# -------------------------------
# PostgreSQL 17 配置文件
# 编码:UTF-8
# -------------------------------

#------------------------------------------------------------------------------
# 需要修改的配置
# 现在针对 64 核 CPU 和 96GB 内存的服务器优化,适用于生产环境。
#------------------------------------------------------------------------------
shared_buffers = 24GB           # 共享内存缓冲区大小,缓存更多数据以减少磁盘 I/O,设为系统内存的 25%
effective_cache_size = 64GB     # 预估系统可用缓存,优化查询规划,设为系统内存的 66%
max_parallel_workers_per_gather = 32 # 每个查询的并行工作进程数,以利用多核,设为系统核心的 50%
max_parallel_maintenance_workers = 16 # 维护操作的并行进程数,以加速索引创建等, 设为系统核心的 25%
max_worker_processes = 64       # 总并行工作进程数,以支持高并发,设为系统核心的 100%

#------------------------------------------------------------------------------
# 连接与认证
#------------------------------------------------------------------------------
# 控制客户端连接和认证相关的设置

listen_addresses = '*'          # 监听所有 IP 地址,生产环境建议限制为特定 IP(如 'localhost' 或 '192.168.1.0/24')以提高安全性
port = 5432                     # 数据库服务端口号,与 Docker Compose 端口映射一致
max_connections = 1000           # 最大客户端连接数
superuser_reserved_connections = 3 # 为超级用户保留的连接数,保持默认值以确保管理员访问
ssl = off                       # 禁用 SSL 加密,生产环境强烈建议启用(需配置证书,参考 https://www.postgresql.org/docs/17/ssl-tcp.html)
password_encryption = scram-sha-256 # 使用现代 SCRAM-SHA-256 密码加密协议,符合安全标准

#------------------------------------------------------------------------------
# 资源限制
#------------------------------------------------------------------------------

work_mem = 256MB                # 单个查询操作的内存限制,以提升复杂查询性能,需监控总内存使用
maintenance_work_mem = 2GB      # 维护性操作(如 VACUUM、CREATE INDEX)的内存限制,2GB 足够
huge_pages = try                # 尝试使用大页内存,需操作系统支持(参考 https://www.postgresql.org/docs/17/kernel-resources.html#linux-huge-pages)

#------------------------------------------------------------------------------
# 预写式日志(WAL)
#------------------------------------------------------------------------------
# 控制事务日志行为,确保数据持久性和支持复制

wal_level = replica             # 设置为 replica,支持流复制和 WAL 归档,适合生产环境
synchronous_commit = on         # 确保事务持久化,优先安全性(关闭可提高性能但增加数据丢失风险)
wal_buffers = 16MB              # WAL 缓冲区大小,16MB 通常足够(约为 shared_buffers 的 3%)
max_wal_size = 4GB              # 自动触发检查点的 WAL 上限,4GB 适合高写入负载
min_wal_size = 1GB              # 最小保留 WAL 大小
checkpoint_timeout = 15min      # 检查点间隔,15 分钟平衡性能和恢复时间
checkpoint_completion_target = 0.9 # 平滑写入检查点,减少 I/O 冲击
fsync = on                      # 确保数据写入磁盘,禁用会提高性能但风险极高,保持开启

#------------------------------------------------------------------------------
# 日志记录
#------------------------------------------------------------------------------
# 配置日志以便监控和调试

logging_collector = on          # 启用日志收集器,将日志写入文件
log_directory = 'log'           # 日志存储目录,需确保容器内有写权限(映射到 /var/lib/postgresql/data/log)
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # 日志文件名格式,按时间命名
log_rotation_age = 1d           # 日志文件最长保留 1 天,自动轮换
log_rotation_size = 100MB       # 单个日志文件最大尺寸,100MB 适合生产环境
log_min_duration_statement = 1000 # 记录执行超过 1000ms 的慢查询,便于性能优化
log_checkpoints = on            # 记录检查点信息,监控 WAL 性能
log_connections = on            # 记录所有客户端连接,便于审计
log_disconnections = on         # 记录所有客户端断开连接,便于审计
log_lock_waits = on             # 记录长锁等待(超过 deadlock_timeout),帮助诊断锁问题
log_temp_files = 0              # 记录所有临时文件使用,0 表示记录所有临时文件

#------------------------------------------------------------------------------
# 自动清理
#------------------------------------------------------------------------------
# 配置自动清理以管理死元组和优化性能

autovacuum = on                 # 启用自动清理死元组,防止表膨胀
autovacuum_max_workers = 5      # 同时运行的最大自动清理进程数,5 个足够中等负载
autovacuum_naptime = 1min       # 自动清理进程唤醒间隔,1 分钟适合高写入环境
autovacuum_vacuum_threshold = 50 # 触发 VACUUM 操作的更新阈值,50 行适合频繁更新
autovacuum_analyze_threshold = 50 # 触发 ANALYZE 操作的更新阈值,50 行适合频繁更新
autovacuum_vacuum_cost_limit = 1000 # 提高自动清理效率,1000 平衡性能和资源
autovacuum_vacuum_scale_factor = 0.1 # 表大小 10% 的死元组触发清理,适合高更新表
log_autovacuum_min_duration = 0 # 记录所有自动清理操作,便于监控
track_io_timing = on            # 监控 I/O 性能,需启用 pg_stat_statements 扩展

#------------------------------------------------------------------------------
# 本地化设置
#------------------------------------------------------------------------------
# 配置日期、时间和字符编码

datestyle = 'iso, ymd'          # 日期格式为 ISO 标准(年-月-日),适合国际化应用
timezone = 'Asia/Shanghai'      # 时区设置为中国上海,匹配本地需求
# lc_messages = 'zh_CN.utf8'     # 系统消息语言为简体中文,需安装中文语言包
# lc_monetary = 'zh_CN.utf8'     # 货币格式为中国标准,需安装中文语言包
# lc_numeric = 'zh_CN.utf8'      # 数字格式为中国标准,需安装中文语言包
# lc_time = 'zh_CN.utf8'         # 时间格式为中国标准,需安装中文语言包
default_text_search_config = 'pg_catalog.english' # 全文搜索配置,建议安装中文分词插件(如 zhparser)

#------------------------------------------------------------------------------
# 锁管理
#------------------------------------------------------------------------------
# 配置锁行为以避免死锁和性能瓶颈

deadlock_timeout = 1s           # 死锁检测超时时间,1 秒为默认值
max_locks_per_transaction = 64  # 每个事务的最大锁数量,64 足够大多数场景

#------------------------------------------------------------------------------
# 字符编码
#------------------------------------------------------------------------------
# 设置客户端编码

client_encoding = utf8          # 客户端字符编码为 UTF-8,支持多语言

#------------------------------------------------------------------------------
# 统计信息
#------------------------------------------------------------------------------
# 启用统计信息以支持性能监控

track_activities = on           # 启用会话活动监控,记录活跃会话
track_counts = on               # 收集数据库统计信息,支持查询优化
track_io_timing = on            # 记录 I/O 操作耗时,便于性能分析

#------------------------------------------------------------------------------
# 并行查询
#------------------------------------------------------------------------------

idle_in_transaction_session_timeout = 10min # 终止空闲事务会话,10 分钟防止资源浪费
lock_timeout = 30s              # 锁等待超时时间,30 秒防止长时间阻塞
statement_timeout = 0           # 全局查询超时,默认不限制,可根据需求设置

此时进入docker-compose.yml所在目录执行 docker-compose up -d 即可运行数据库和两个web端管理工具了。至于如何下载镜像,大家自行探索。

进入容器配置插件

shell 复制代码
$ docker exec -it postgres17 /bin/bash

> apt update
> apt install curl gpg
# 安装插件源,由pigsty提供,参考:https://pigsty.cc/ext/repo/apt/
> curl -fsSL https://repo.pigsty.cc/key | gpg --dearmor -o /etc/apt/keyrings/pigsty.gpg

# 添加源
> tee /etc/apt/sources.list.d/pigsty-io.list > /dev/null <<EOF
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.cc/apt/infra generic main
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.cc/apt/pgsql/bookworm bookworm main
EOF

> apt update

# 安装插件,插件列表参考:https://pigsty.cc/ext/list/deb/
> apt install postgresql-17-pg-analytics
> apt install postgresql-17-repack

# 启用插件,需要进入psql
> psql -U postgres -d postgres

- CREATE EXTENSION pg_analytics;
- CREATE EXTENSION pg_trgm ;
- CREATE EXTENSION pg_repack;

# 查看插件是否已启用
- \dx
# 退出psql
- exit;

# 退出容器
> exit;

# 将容器打包,以便之后备用
$ docker commit postgres my-postgres:17.5
# 保存容器,以便移植
$ docker save -o my-postgres17.5.tar my-postgres:17.5

当容器 down 后重新部署的话,则需要重新启用插件。启用插件不需要去psql中,在gui(pgadmin4,Dbeaver)等工具中执行 CREATE EXTENSION XXX 即可。

相关推荐
JanelSirry17 小时前
微服务是不是一定要容器化(如 Docker)?我该怎么选
docker·微服务·架构
小屁不止是运维17 小时前
k8s问题详解1:k8s集群上传文件过大导致413 Request Entity Too Large(请求文件实体过大)
docker·容器·kubernetes
聆风吟º18 小时前
无需 VNC / 公网 IP!用 Docker-Webtop+cpolar,在手机浏览器远程操控 Linux
linux·运维·docker
科技D人生18 小时前
物联网开发学习总结(5)—— 深入对比 TDengine、InfluxDB 和 TimescaleDB 三大主流时序数据库的性能表现
物联网·postgresql·时序数据库·influxdb·tdengine·timescaledb
ZLRRLZ18 小时前
【Docker】Docker镜像仓库
docker·容器
知白守黑26721 小时前
docker资源限制
运维·docker·容器
无妄无望1 天前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
爱宇阳1 天前
禅道社区版 Docker Compose 服务迁移教程
运维·docker·容器
xzl041 天前
docker运行Ubuntu22.04
docker
vue学习1 天前
docker 学习dockerfile 构建 Nginx 镜像-部署 nginx 静态网
java·学习·docker