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

前言
传统手动部署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

⚠️ 注意:检查发现
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

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

3. 添加执行权限
chmod +x /usr/local/bin/docker-compose

4. 建立软链接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

5. 验证版本
[root@openeuler-server data]# docker-compose --versionDocker Compose version v2.20.0

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

? 提示:从 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

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

# 查看容器运行状态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

# 查看实时日志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

2.4 验证部署
# 进入容器docker exec -it pg18 bash
效果:
[root@openeuler-server postgres18]# docker exec -it pg18 bash91b8b62007f3:/#

# 连接数据库psql -U postgres -d postgres
输出:
91b8b62007f3:/# psql -U postgres -d postgrespsql (18.3) Type "help" for help. postgres=#

-- 查看 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)

✅ 预期输出应包含
PostgreSQL 18.x on x86_64-pc-linux-musl等版本信息。
2.5 外部工具连接(Navicat)
- 主机:服务器IP
- 端口:5432
- 用户:postgres
- 密码:postgres
- 库:postgres
连接步骤截图:





三、进阶配置
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)

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

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)

3.4 验证切换数据库
-- 切换到物联网业务库\c iot_platform
输出:
postgres=# \c iot_platformYou are now connected to database "iot_platform" as user "postgres". iot_platform=#

✅ 显示
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)

-- 查看当前执行的查询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)

总结
通过 Docker Compose 部署 PostgreSQL 18,我们可以在几分钟内完成数据库的安装与配置,实现真正的 “分钟级安装” 和 “秒级恢复”,完美适配现代云原生环境。
本文核心要点回顾
- Docker 官方镜像数据目录结构从 18 版本开始变更,升级时需注意路径差异
- Docker Compose 提供了优雅的服务编排方式,便于维护和扩展
- 建议生产环境固定镜像版本号,配合健康检查和资源限制保障服务稳定性
作者注
—— 本文所有操作及测试均基于 openEuler 22.03 (LTS-SP4) 操作系统、 PostgreSQL 18.3 官方镜像 版本完成,核心围绕 Docker-Compose 容器化一键部署实战展开。请注意,PostgreSQL 社区版本处于持续迭代更新中,细节可能存在个人实践理解偏差,请以 PostgreSQL 全球官方文档 最新内容为准。
—— 日常学习持续参考 刘华阳老师 AustinDatabases、digoal德哥PG技术专栏与深度实践文章。本文仅为个人学习实践总结,不代表任何组织、社区及厂商官方观点。
欢迎关注 “shunwah星辰数智社”,一起交流探讨。