PG18 容器化实战:Docker Compose 5 分钟一键部署

5分钟搞定!Docker Compose 部署 PostgreSQL 18 实战指南

作者: ShunWah
公众号: "shunwah星辰数智社"主理人。

持有认证: OceanBase、MySQL OCP、OpenGauss、崖山、金仓KingBase、KaiwuDB、 亚信AntDBCA、翰高、GBase、Galaxybase GBCA、Neo4j 、NebulaGraph、东方通TongTech、TiDB等多项权威认证。

获奖经历: 崖山YashanDB YVP、浪潮KaiwuDB MVP、墨天轮 MVP、金仓社区KVA、TiDB社区MVA、NebulaGraph社区之星、IFClub星珩联盟·智库星系技术专家、ITPUB 技术专家,社区版主及布道师。在OceanBase&墨天轮征文大赛、OpenGauss、TiDB、YashanDB、Kingbase、KWDB、Navicat 征文等赛事中多次斩获一、二、三等奖,原创技术文章常年被墨天轮、CSDN、ITPUB 等平台首页推荐。

  • CSDN_ID: shunwahma
  • 墨天轮_ID:shunwah
  • ITPUB_ID: shunwah
  • IFClub_ID:shunwah

生成特定主题图片 PG.jpg

前言

传统手动部署PostgreSQL需要逐一处理复杂系统依赖、内核参数、编译配置与目录权限,整套流程繁琐易错,完整部署耗时至少半小时以上。

日常学习PostgreSQL技术时,我日常也在参考学习 刘华阳老师AustinDatabases专栏digoal德哥的深度技术文章,持续跟进PG前沿特性与最佳实践,也深刻感受到新版PostgreSQL在性能、易用性上的巨大升级。

PostgreSQL 18 于2025年9月25日正式发布,重磅引入全新异步I/O(AIO)子系统,在顺序扫描、位图堆扫描、VACUUM清理等核心场景实现跨越式性能提升,存储读取场景性能最高提升 3倍。同时Docker官方镜像数据目录结构迎来重大变革,新版严格遵循pg_ctlcluster标准目录规范,将PGDATA调整为 /var/lib/postgresql/18/docker,原生支持多版本共存平滑部署。本文从环境准备、版本升级、容器部署、连接验证、业务初始化到日常运维,全程手把手实战落地,带大家一步步完成PostgreSQL 18完整容器化部署。

一、环境准备

1.1 基础环境要求

  • Docker 版本:≥ 24.0
  • Docker Compose 版本:≥ 2.20.0
  • 宿主机配置:建议至少 2 核 CPU、4GB 内存,确保开放 5432 端口

1.2 验证 Docker 环境

执行以下命令确认 Docker 和 Docker Compose 已正确安装:

# 检查 Docker 版本docker --version# 检查 Docker Compose 版本docker compose version# 启动 Docker 服务(如未启动)sudo systemctl start docker

实际输出示例:

[root@openeuler-server data]# docker --versionDocker version 20.10.24, build 297e128
[root@openeuler-server data]# docker-compose --versiondocker-compose version 1.28.6, build 5db8d86f

image.png

⚠️  注意:检查发现  docker-compose version 1.28.6 不符合 ≥ 2.20.0 的要求,需要升级。

1.3 升级 docker-compose 版本

1. 删除旧文件

rm -f /usr/local/bin/docker-compose
rm -f /usr/bin/docker-compose

image.png

2. 使用国内镜像下载 v2.20.0

wget -O /usr/local/bin/docker-compose https://ghproxy.net/https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-linux-x86_64

image.png

3. 添加执行权限

chmod +x /usr/local/bin/docker-compose

image.png

4. 建立软链接

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

image.png

5. 验证版本

[root@openeuler-server data]# docker-compose --versionDocker Compose version v2.20.0

image.png

1.4 创建项目目录

# 创建项目根目录及数据持久化目录mkdir -p /data/postgres18 && cd /data/postgres18
mkdir -p data logs init
ls

执行效果:

[root@openeuler-server data]# mkdir -p /data/postgres18 && cd /data/postgres18[root@openeuler-server postgres18]# mkdir -p data logs init[root@openeuler-server postgres18]# lsdata  init  logs

image.png

提示:从 PostgreSQL 18 开始,官方镜像建议将数据目录挂载到  /var/lib/postgresql 而非  /var/lib/postgresql/data。如果从旧版本升级,直接挂载旧目录会导致启动失败。


二、Docker Compose 部署

2.1 编写 docker-compose.yml

cat > docker-compose.yml << EOF
version: '3.8'
services:
  postgres18:
    image: postgres:18-alpine
    container_name: pg18
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    volumes:
      - ./data:/var/lib/postgresql
      - ./init:/docker-entrypoint-initdb.d
      - ./logs:/var/log/postgresql
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
networks:
  default:
    name: pg18-network
EOF

image.png

2.2 关键配置参数说明

参数 作用
image: postgres:18-alpine 指定 PostgreSQL 18 Alpine 轻量版镜像
restart: always 容器退出后自动重启
ports 将宿主机 5432 端口映射到容器 5432 端口
POSTGRES_USER 设置数据库超级用户名
POSTGRES_PASSWORD 设置数据库超级用户密码
POSTGRES_DB 启动时自动创建的默认数据库
./data 数据持久化目录
./init 初始化脚本目录(*.sql 或 *.sh 文件会在首.次启动时自动执行)
./logs 日志存储目录

2.3 启动容器

# 后台启动(日常使用)docker-compose up -d

执行日志(部分):

[root@openeuler-server postgres18]# docker-compose up -d[+] Running 10/10
 ✔ postgres18 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                   32.5s 
   ✔ 6a0ac1617861 Pull complete                                                              3.6s 
   ...
[+] Running 2/2
 ✔ Network pg18-network  Created                                                             0.3s 
 ✔ Container pg18        Started                                                             0.7s

image.png

# 查看容器运行状态docker-compose ps

输出示例:

[root@openeuler-server postgres18]# docker-compose psNAME                IMAGE                COMMAND                  SERVICE             CREATED             STATUS              PORTS
pg18                postgres:18-alpine   "docker-entrypoint.s…"   postgres18          3 minutes ago       Up 3 minutes        0.0.0.0:5432->5432/tcp, :::5432->5432/tcp

image.png

# 查看实时日志docker-compose logs -f

关键日志片段:

pg18  | The files belonging to this database system will be owned by user "postgres".
...
pg18  | 2026-04-22 03:26:30.930 UTC [1] LOG:  database system is ready to accept connections

image.png

2.4 验证部署

# 进入容器docker exec -it pg18 bash

效果:

[root@openeuler-server postgres18]# docker exec -it pg18 bash91b8b62007f3:/#

image.png

# 连接数据库psql -U postgres -d postgres

输出:

91b8b62007f3:/# psql -U postgres -d postgrespsql (18.3)
Type "help" for help.
postgres=#

image.png

-- 查看 PostgreSQL 版本SELECT version();

输出:

postgres=# SELECT version();
                                         version                                         
-----------------------------------------------------------------------------------------
 PostgreSQL 18.3 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
(1 row)

image.png

✅ 预期输出应包含  PostgreSQL 18.x on x86_64-pc-linux-musl 等版本信息。

2.5 外部工具连接(Navicat)

  • 主机:服务器IP
  • 端口:5432
  • 用户:postgres
  • 密码:postgres
  • :postgres

连接步骤截图:

image.png

image.png

image.png

image.png

image.png


三、进阶配置

3.1 创建物联网专用数据库

-- 创建数据库CREATE DATABASE iot_platform;-- 查看所有数据库列表(验证是否创建成功)\l

执行效果:

postgres=# CREATE DATABASE iot_platform;CREATE DATABASEpostgres=# \l
                                                      List of databases
     Name     |  Owner   | Encoding | Locale Provider |  Collate   |   Ctype    | Locale | ICU Rules |   Access privileges   --------------+----------+----------+-----------------+------------+------------+--------+-----------+-----------------------
 iot_platform | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | 
 postgres     | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | 
 template0    | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | =c/postgres          +
              |          |          |                 |            |            |        |           | postgres=CTc/postgres
 template1    | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | =c/postgres          +
              |          |          |                 |            |            |        |           | postgres=CTc/postgres
(4 rows)

image.png

3.2 创建业务用户

CREATE USER iot_user WITH PASSWORD 'Secu!re%d123';-- 查看所有数据库用户\du

输出:

postgres=# CREATE USER iot_user WITH PASSWORD 'Secu!re%d123';CREATE ROLEpostgres=# \du
                             List of roles
 Role name |                         Attributes                         -----------+------------------------------------------------------------
 iot_user  | 
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS

image.png

3.3 授权库权限

GRANT ALL PRIVILEGES ON DATABASE iot_platform TO iot_user;-- 查看 iot_platform 库的权限归属\l iot_platform

输出:

postgres=# GRANT ALL PRIVILEGES ON DATABASE iot_platform TO iot_user;GRANTpostgres=# \l iot_platform
                                                      List of databases
     Name     |  Owner   | Encoding | Locale Provider |  Collate   |   Ctype    | Locale | ICU Rules |   Access privileges   --------------+----------+----------+-----------------+------------+------------+--------+-----------+-----------------------
 iot_platform | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | =Tc/postgres         +
              |          |          |                 |            |            |        |           | postgres=CTc/postgres+
              |          |          |                 |            |            |        |           | iot_user=CTc/postgres
(1 row)

image.png

3.4 验证切换数据库

-- 切换到物联网业务库\c iot_platform

输出:

postgres=# \c iot_platformYou are now connected to database "iot_platform" as user "postgres".
iot_platform=#

image.png

✅ 显示  You are now connected to database "iot_platform" as user "postgres". 代表  100% 成功!


四、常用运维命令

4.1 容器管理

# 停止容器docker-compose stop# 启动容器docker-compose start# 重启容器docker-compose restart# 删除容器(保留数据卷)docker-compose down# 删除容器并清理数据卷docker-compose down -v

4.2 数据库操作

-- 查看数据库连接数SELECT count(*) FROM pg_stat_activity;

输出示例:

postgres=# SELECT count(*) FROM pg_stat_activity;
 count 
-------
    10
(1 row)

image.png

-- 查看当前执行的查询SELECT pid, usename, query FROM pg_stat_activity WHERE state = 'active';

输出示例:

postgres=# SELECT pid, usename, query FROM pg_stat_activity WHERE state = 'active';
 pid | usename  |                                  query                                   
-----+----------+--------------------------------------------------------------------------
 722 | postgres | SELECT pid, usename, query FROM pg_stat_activity WHERE state = 'active';
(1 row)

image.png


总结

通过 Docker Compose 部署 PostgreSQL 18,我们可以在几分钟内完成数据库的安装与配置,实现真正的  “分钟级安装” 和  “秒级恢复”,完美适配现代云原生环境。

本文核心要点回顾

  • Docker 官方镜像数据目录结构从 18 版本开始变更,升级时需注意路径差异
  • Docker Compose 提供了优雅的服务编排方式,便于维护和扩展
  • 建议生产环境固定镜像版本号,配合健康检查和资源限制保障服务稳定性

作者注

—— 本文所有操作及测试均基于  openEuler 22.03 (LTS-SP4) 操作系统、 PostgreSQL 18.3 官方镜像 版本完成,核心围绕 Docker-Compose 容器化一键部署实战展开。请注意,PostgreSQL 社区版本处于持续迭代更新中,细节可能存在个人实践理解偏差,请以  PostgreSQL 全球官方文档 最新内容为准。

—— 日常学习持续参考 刘华阳老师 AustinDatabases、digoal德哥PG技术专栏与深度实践文章。本文仅为个人学习实践总结,不代表任何组织、社区及厂商官方观点。

欢迎关注  “shunwah星辰数智社”,一起交流探讨。

请使用浏览器的分享功能分享到微信等