没想到!IvorySQL 居然同步了原生 PG18.4 镜像

📖 前言
前段时间发了一篇 IvorySQL 国内镜像实测文章,不少读者私信问:仓库里能不能拉原生 PostgreSQL?
今天专门拿 openEuler 真机完整测一遍 PG 18.4-bookworm 镜像,把整套实操、踩坑点一次性说透。
之前用 Docker Hub 拉 PG 镜像,老毛病一堆:⏱️ 高峰几百 KB/s、下到 90% 直接断连,机房无外网代理时干脆完全拉不动。现在 IvorySQL 社区 registry.highgo 仓库同步了官方原生 PG 镜像,不用切换第三方加速源,一套仓库同时跑 IvorySQL、原生 PG,做迁移对比、兼容性测试特别省事。
全文没有套话,全部是真机复制可执行命令,把版本标签坑、磁盘爆满、宿主机无客户端、命令粘贴报错这些运维高频问题全部拆解,新手照着操作也能一次性部署成功。
🔥 写在前面:本文所有命令均基于 openEuler 真机实测,截图均为实际操作记录,非模拟演示。
一、前置环境说明
本次实测机器配置:
| 项目 | 版本/信息 |
|---|---|
| 🖥️ 操作系统 | openEuler |
| 🐳 Docker | 20.10.24 |
| 📦 Docker Compose | v2.20.0 |
| 📍 镜像仓库 | registry.highgo.com |
| 🎯 测试镜像 | registry.highgo.com/postgres/postgres:18.4-bookworm |
[root@openeuler-server ~]# docker --version
Docker version 20.10.24, build 297e128
[root@openeuler-server ~]# docker-compose --version
Docker Compose version v2.20.0
[root@openeuler-server ~]#

1.1 🚨 先划重点:镜像标签致命大坑
很多人会直接执行下面这条命令,百分百报错:
# ❌ 错误写法,纯数字tag仓库不存在,而且路径也是错的少了postgres/postgres
docker pull registry.highgo.com/postgres:18.4
1.1.1 报错现场
[root@openeuler-server ~]# docker pull registry.highgo.com/postgres:18.4
Error response from daemon: unknown: bad request: invalid repository name: postgres
[root@openeuler-server ~]#

1.1.2 原因 & 正确指令
📌 根因:仓库内 PG 镜像必须携带系统发行后缀
-bookworm/-trixie,不能只写数字版本。📌 正确:仓库内 PG 镜像的完整路径是
postgres/postgres,不是postgres;且标签必须带-bookworm发行版后缀
✅ 正确拉取命令:
[root@openeuler-server ~]# docker pull registry.highgo.com/postgres/postgres:18.4-bookworm
18.4-bookworm: Pulling from postgres/postgres
dc4bf025fa70: Pull complete
07800c4658aa: Pull complete
d3b29a572ab1: Pull complete
9c32480c36e2: Pull complete
ab0222f6080d: Pull complete
26068876c106: Pull complete
204ea99b8184: Pull complete
b9b7e4c43bc2: Pull complete
d626a1ee2499: Pull complete
df093a451bde: Pull complete
4551c7621254: Pull complete
b7cc028a2062: Pull complete
4ea1c3550cc2: Pull complete
Digest: sha256:d323ae4f611b8c41e2488693785b770d2797c10e859b259e4e7706246debb069
Status: Downloaded newer image for registry.highgo.com/postgres/postgres:18.4-bookworm
registry.highgo.com/postgres/postgres:18.4-bookworm
[root@openeuler-server ~]#

二、⚡ 极速拉取:从20分钟到30秒
2.1 执行拉取
[root@openeuler-server ~]# docker pull registry.highgo.com/postgres/postgres:18.4-bookworm
18.4-bookworm: Pulling from postgres/postgres
67cf8384fcca: Pull complete
047252d203fc: Pull complete
285c515ff12e: Pull complete
c04bac481cf: Pull complete
4d2f8983bdeb: Pull complete
928cbc530e9b: Pull complete
b7d7c0b1553c: Pull complete
ef11daf91965: Pull complete
5dab6177213d: Pull complete
b73f5647695f: Pull complete
9c1186127d05: Pull complete
c73bb36f2399: Pull complete
142af709c9ab: Pull complete
Digest: sha256:1fa4bccc8246ee2ba9592895d804dcf767119e632999ef22d2b3355a93b627c3
Status: Downloaded newer image for registry.highgo.com/postgres/postgres:18.4-bookworm
registry.highgo.com/postgres/postgres:18.4-bookworm
💡 实测效果:从敲下回车到下载完毕,大概只用了30秒左右。之前在 Docker Hub 上龟速爬行的日子一去不复返,下载速度直接飙到几十 MB/s。这效率,简直是质的飞跃。
2.2 镜像完整性校验
拉完核对镜像 ID、文件大小,确认无损坏分层:
[root@openeuler-server ~]# docker images | grep postgres
registry.highgo.com/postgres/postgres 18.4-bookworm dda003c01642 2 weeks ago 440MB
registry.highgo.com/postgres/postgres 18.3-bookworm 3c67953c3a90 7 weeks ago 440MB
[root@openeuler-server ~]#

三、🚀 启动容器:连环踩坑实录
镜像拉下来了,接下来就是启动。这里我要特别提醒一句:PostgreSQL 的 Docker 镜像和 MySQL / IvorySQL 有点不一样,它默认不会暴露 1521 端口,而且对环境变量的要求比较"倔强"。
3.1 坑①:Shell 历史扩展 !! 引发的"鬼畜"报错
我第一次启动时,习惯性地用了之前 IvorySQL 的命令风格,结果悲剧了:
[root@openeuler-server ~]# docker run --name pg184 -p 5432:5432 -e POSTGRES_PASSWORD=StrongPass456!! -v pgdata:/var/lib/postgresql/data -d registry.highgo.com/postgres/postgres:18.4-bookworm
Unable to find image 'run:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 202.160.130.66:443: connect: connection timed out.
See 'docker run --help'.
[root@openeuler-server ~]#

🔍 根因分析:你注意看密码:
StrongPass456!!。在 Bash 等 Shell 中,!!是一个特殊指令,意思是"重复执行上一条命令"。Shell 在执行前会把!!替换成上一条完整命令,结果就"展开"成了一条包含自身的超长命令,自然报错。
✅ 解决方案:用单引号或双引号把密码包起来:
[root@openeuler-server ~]# docker run --name pg184 -p 5432:5432 -e POSTGRES_PASSWORD='StrongPass456!!' -v pgdata:/var/lib/postgresql/data -d registry.highgo.com/postgres/postgres:18.4-bookworm
5867e8daa44e925e7818598013a1da62ad7dbdd685e6aa0fae68a94d590edbce
docker: Error response from daemon: driver failed programming external connectivity on endpoint pg184 (7e11a12a731fb44d5aea01d0363b015deadb223d87df0569a40c46a0698da70e): Bind for 0.0.0.0:5432 failed: port is already allocated.
[root@openeuler-server ~]#

3.2 坑②:端口 5432 已被 IvorySQL 占用
报错信息:Bind for 0.0.0.0:5432 failed: port is already allocated。
看一眼 docker ps -a 的结果,真相大白:
[root@openeuler-server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5867e8daa44e registry.highgo.com/postgres/postgres:18.4-bookworm "docker-entrypoint.s…" 31 seconds ago Created pg184
90f5945502a0 registry.highgo.com/ivorysql/ivorysql:5.3-ubi8 "docker-entrypoint.s…" 9 days ago Up 9 days 0.0.0.0:1521->1521/tcp, :::1521->1521/tcp, 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp, 5866/tcp ivorysql

那个叫 ivorysql 的容器已经占了 5432。一台服务器上,一个端口同一时间只能服务一个程序。
✅ 解决方案:换个端口映射。把宿主机的 5433 映射到容器的 5432:
[root@openeuler-server ~]# docker stop pg184
pg184
[root@openeuler-server ~]# docker rm pg184
pg184
[root@openeuler-server ~]# docker run --name pg184 -p 5433:5432 -e POSTGRES_PASSWORD='StrongPass456!!' -v pgdata:/var/lib/postgresql/data -d registry.highgo.com/postgres/postgres:18.4-bookworm
aa42ab39ec930934befb825efa15e7b646af0cd3b84560c3ff5aba73818af60b
[root@openeuler-server ~]#

3.3 坑③:PostgreSQL 18+ 数据路径 Breaking Change
端口解决了,但容器还是没起来:
[root@openeuler-server ~]# docker ps | grep pg18
[root@openeuler-server ~]#
查看日志:
[root@openeuler-server ~]# docker logs pg184
Error: in 18+, these Docker images are configured to store database data in a
format which is compatible with "pg_ctlcluster" (specifically, using
major-version-specific directory names).
Counter to that, there appears to be PostgreSQL data in:
/var/lib/postgresql/data (unused mount/volume)
The suggested container configuration for 18+ is to place a single mount
at /var/lib/postgresql which will then place PostgreSQL data in a
subdirectory...

🔍 根因分析:从 PostgreSQL 18 开始,官方 Docker 镜像**不再把数据存在 **
/var/lib/postgresql/data,而是放在带版本号的新路径/var/lib/postgresql/18/docker。你的挂载点/var/lib/postgresql/data是旧路径,PG 18 启动时发现路径对不上,直接报错退出。
✅ 解决方案:把挂载点从 /var/lib/postgresql/data 改为 /var/lib/postgresql:
[root@openeuler-server ~]# docker stop pg184
pg184
[root@openeuler-server ~]# docker rm pg184
pg184
[root@openeuler-server ~]# docker run --name pg184 -p 5433:5432 -e POSTGRES_PASSWORD='StrongPass456!!' -v pgdata:/var/lib/postgresql -d registry.highgo.com/postgres/postgres:18.4-bookworm
0ea9e62cd3d0f19a6a791914f2b946ca417ba7247556a4b8f56b3c851118e2ba
[root@openeuler-server ~]#

3.4 ✅ 终于启动成功
[root@openeuler-server ~]# docker ps | grep pg18
0ea9e62cd3d0 registry.highgo.com/postgres/postgres:18.4-bookworm "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp pg184
[root@openeuler-server ~]#

查看日志确认就绪:
[root@openeuler-server ~]# docker logs pg184 | tail -10
2026-06-27 09:56:43.153 UTC [1] LOG: starting PostgreSQL 18.4 (Debian 18.4-1.pgdg12+1) on x86_64-pc-linux-gnu
2026-06-27 09:56:43.153 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
2026-06-27 09:56:43.153 UTC [1] LOG: listening on IPv6 address "::", port 5432
2026-06-27 09:56:43.155 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2026-06-27 09:56:43.161 UTC [73] LOG: database system was shut down at 2026-06-27 09:56:43 UTC
2026-06-27 09:56:43.170 UTC [1] LOG: database system is ready to accept connections

🎉 看到 ready to accept connections,成了!
四、📦 生产环境 Docker Compose 编排
单机 run 命令适合临时测试,长期测试、准生产环境统一使用 Compose 管理,配置集中、扩容迁移更便捷。
4.1 新建编排工作目录
[root@openeuler-server ~]# mkdir -p /data/pg-compose
[root@openeuler-server ~]# cd /data/pg-compose
[root@openeuler-server pg-compose]#

4.2 docker-compose.yml 完整配置(适配 PG18.4)
[root@openeuler-server pg-compose]# vim docker-compose.yml
version: '3.8'
services:
pg18:
image: registry.highgo.com/postgres/postgres:18.4-bookworm
container_name: pg18
restart: always
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: PGtest@2026
POSTGRES_DB: testdb
# ⚠️ PG18+挂载根目录 /var/lib/postgresql,非 /data 子目录
volumes:
- ./pgdata:/var/lib/postgresql
networks:
pg_net:
networks:
pg_net:
driver: bridge

4.3 ⚠️ 启动报错又一个端口冲突
[root@openeuler-server pg-compose]# docker-compose up -d
Error response from daemon: Bind for 0.0.0.0:5432 failed: port is already allocated
[root@openeuler-server pg-compose]#

🔍 根因:Compose 模板里写的是
"5432:5432",直接和 IvorySQL 的5432端口冲突。调整为"5435:5432"即可。
4.4 修改 docker-compose.yml 完整配置(适配 PG18.4)
[root@openeuler-server pg-compose]# vim docker-compose.yml
version: '3.8'
services:
pg18:
image: registry.highgo.com/postgres/postgres:18.4-bookworm
container_name: pg18
restart: always
ports:
- "5435:5432" # 宿主机5435,避开5432/5433占用
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: PGtest@2026
POSTGRES_DB: testdb
# ⚠️ PG18+挂载根目录 /var/lib/postgresql,非 /data 子目录
volumes:
- ./pgdata:/var/lib/postgresql
networks:
pg_net:
networks:
pg_net:
driver: bridge

4.5 修正后重新启动
[root@openeuler-server pg-compose]# docker-compose down
[+] Running 2/2
✔ Container pg18 Removed 0.0s
✔ Network pg-compose_pg_net Removed 0.2s
[root@openeuler-server pg-compose]# vim docker-compose.yml # 端口改为5435
[root@openeuler-server pg-compose]# docker-compose up -d
[+] Running 2/2
✔ Network pg-compose_pg_net Created 0.2s
✔ Container pg18 Started 0.4s
[root@openeuler-server pg-compose]#

查看日志确认成功:
[root@openeuler-server pg-compose]# docker logs pg18 | grep "ready to accept"
2026-06-27 10:31:46.188 UTC [1] LOG: database system is ready to accept connections
4.6 验证容器运行状态
[root@openeuler-server pg-compose]# docker ps | grep pg18
1d53e4097a3d registry.highgo.com/postgres/postgres:18.4-bookworm "docker-entrypoint.s…" 30 seconds ago Up 29 seconds 0.0.0.0:5435->5432/tcp, :::5435->5432/tcp pg18
0ea9e62cd3d0 registry.highgo.com/postgres/postgres:18.4-bookworm "docker-entrypoint.s…" 35 minutes ago Up 35 minutes 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp pg184
[root@openeuler-server pg-compose]#

五、🔍 PostgreSQL 18.4 基础 CRUD 实操验证
容器日志输出 database system is ready to accept connections 代表数据库完全初始化完毕,直接进入容器完成版本校验与增删改查全流程验证。
5.1 进入数据库终端 & 版本校验
[root@openeuler-server pg-compose]# docker exec -it pg18 psql -U postgres
psql (18.4 (Debian 18.4-1.pgdg12+1))
Type "help" for help.
postgres=# select version();
version
------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 18.4 (Debian 18.4-1.pgdg12+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14+deb12u1) 12.2.0, 64-bit
(1 row)

5.2 完整 CRUD 示例
-- 1. 创建测试业务表
CREATE TABLE test_user (
id BIGSERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
age INT,
create_time TIMESTAMP DEFAULT now()
);
postgres=# CREATE TABLE test_user (
id BIGSERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
age INT,
create_time TIMESTAMP DEFAULT now()
);
CREATE TABLE
postgres=#

-- 2. 新增多条测试数据
INSERT INTO test_user (username,age) VALUES
('zhangsan',24),
('lisi',28),
('wangwu',32);
postgres=# INSERT INTO test_user (username,age) VALUES
('zhangsan',24),
('lisi',28),
('wangwu',32);
INSERT 0 3
postgres=#

-- 3. 全表查询
SELECT * FROM test_user;
postgres=# SELECT * FROM test_user;
id | username | age | create_time
----+----------+-----+----------------------------
1 | zhangsan | 24 | 2026-06-27 12:29:53.710586
2 | lisi | 28 | 2026-06-27 12:29:53.710586
3 | wangwu | 32 | 2026-06-27 12:29:53.710586
(3 rows)

-- 4. 条件更新数据
UPDATE test_user SET age=29 WHERE username='lisi';
postgres=# UPDATE test_user SET age=29 WHERE username='lisi';
UPDATE 1
postgres=#

-- 5. 确认更新结果
SELECT * FROM test_user;
postgres=# SELECT * FROM test_user;
id | username | age | create_time
----+----------+-----+----------------------------
1 | zhangsan | 24 | 2026-06-27 12:29:53.710586
3 | wangwu | 32 | 2026-06-27 12:29:53.710586
2 | lisi | 29 | 2026-06-27 12:29:53.710586
(3 rows)

-- 6. 删除指定行数据
DELETE FROM test_user WHERE username='wangwu';
postgres=# DELETE FROM test_user WHERE username='wangwu';
DELETE 1
postgres=#

-- 7. 最终结果验证
SELECT * FROM test_user;
postgres=# SELECT * FROM test_user;
id | username | age | create_time
----+----------+-----+----------------------------
1 | zhangsan | 24 | 2026-06-27 12:29:53.710586
2 | lisi | 29 | 2026-06-27 12:29:53.710586
(2 rows)
postgres=# \q
[root@openeuler-server pg-compose]#

六、📊 连接端口区分说明
| 部署方式 | 外部连接端口 | 数据库类型 |
|---|---|---|
| IvorySQL 容器 | 5432 / 1521 | IvorySQL 5.3 |
| 单机 run 部署 | 5433 | PostgreSQL 18.4 |
| Compose 部署 | 5435 | PostgreSQL 18.4 |
# Compose 容器内免密登录(不受宿主机端口影响)
[root@openeuler-server pg-compose]# docker exec -it pg18 psql -U postgres
psql (18.4 (Debian 18.4-1.pgdg12+1))
Type "help" for help.
postgres=#
