外网拉 PostgreSQL 镜像苦熬 20 分钟?IvorySQL 社区国内源 30 秒极速拉取原生 PostgreSQL 18.4
作者: ShunWah
公众号: "shunwah星辰数智社"主理人。持有认证: OceanBase、MySQL、OpenGauss、崖山、金仓KingBase、KaiwuDB、亚信AntDBCA、翰高、GBase、Galaxybase、Neo4j、NebulaGraph、东方通TongTech、TiDB 等多项权威认证。
获奖经历: 崖山YashanDB YVP、浪潮KaiwuDB MVP、墨天轮 MVP、金仓社区KVA、TiDB社区MVA、NebulaGraph社区之星、IFClub星珩联盟·智库星系技术专家、ITPUB 技术专家、GBase 8a开发者联盟成员 社区版主及布道师。在OceanBase&墨天轮征文大赛、OpenGauss、TiDB、YashanDB、Kingbase、KWDB、Navicat 征文等赛事中多次斩获一、二、三等奖,原创技术文章常年被墨天轮、CSDN、ITPUB 等平台首页推荐。

前段时间发了一篇 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 ~]#

很多人会直接执行下面这条命令, 百分百报错:
# ❌ 错误写法,纯数字tag仓库不存在docker pull registry.highgo.com/postgres:18.4
[root@openeuler-server ~]# docker pull registry.highgo.com/postgres:18.4Error response from daemon: unknown: bad request: invalid repository name: postgres [root@openeuler-server ~]#

📌 根因:仓库内 PG 镜像必须携带系统发行后缀
-bookworm/-trixie,不能只写数字版本。
✅ 正确拉取命令:
[root@openeuler-server ~]# docker pull registry.highgo.com/postgres/postgres:18.4-bookworm18.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 ~]#

[root@openeuler-server ~]# docker pull registry.highgo.com/postgres/postgres:18.4-bookworm18.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。这效率,简直是质的飞跃。
拉完核对镜像 ID、文件大小,确认无损坏分层:
[root@openeuler-server ~]# docker images | grep postgresregistry.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 端口,而且对环境变量的要求比较"倔强"。
!! 引发的"鬼畜"报错我第一次启动时,习惯性地用了之前 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-bookwormUnable 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-bookworm5867e8daa44e925e7818598013a1da62ad7dbdd685e6aa0fae68a94d590edbce 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 ~]#

报错信息:
Bind for 0.0.0.0:5432 failed: port is already allocated。
看一眼
docker ps -a 的结果,真相大白:
[root@openeuler-server ~]# docker ps -aCONTAINER 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 pg184pg184 [root@openeuler-server ~]# docker rm pg184pg184 [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-bookwormaa42ab39ec930934befb825efa15e7b646af0cd3b84560c3ff5aba73818af60b [root@openeuler-server ~]#

端口解决了,但容器还是没起来:
[root@openeuler-server ~]# docker ps | grep pg18[root@openeuler-server ~]#
查看日志:
[root@openeuler-server ~]# docker logs pg184Error: 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 pg184pg184 [root@openeuler-server ~]# docker rm pg184pg184 [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-bookworm0ea9e62cd3d0f19a6a791914f2b946ca417ba7247556a4b8f56b3c851118e2ba [root@openeuler-server ~]#

[root@openeuler-server ~]# docker ps | grep pg180ea9e62cd3d0 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 -102026-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,成了!
单机 run 命令适合临时测试,长期测试、准生产环境统一使用 Compose 管理,配置集中、扩容迁移更便捷。
[root@openeuler-server ~]# mkdir -p /data/pg-compose[root@openeuler-server ~]# cd /data/pg-compose[root@openeuler-server pg-compose]#

[root@openeuler-server pg-compose]# vim docker-compose.ymlversion: '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

[root@openeuler-server pg-compose]# docker-compose up -dError 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"即可。
[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
[root@openeuler-server pg-compose]# docker ps | grep pg181d53e4097a3d 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]#

容器日志输出
database system is ready to accept connections 代表数据库完全初始化完毕,直接进入容器完成版本校验与增删改查全流程验证。
[root@openeuler-server pg-compose]# docker exec -it pg18 psql -U postgrespsql (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)

-- 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 postgrespsql (18.4 (Debian 18.4-1.pgdg12+1)) Type "help" for help. postgres=#

postgres:18.4 拉取失败-bookworm 后缀完整标签!! 导致命令错乱!! 后命令被"展开",报
Unable to find image 'run:latest'! 的密码Bind for 0.0.0.0:5432 failed: port is already allocated5433:5432 或
5435:5432unused mount/volume/var/lib/postgresql,
不是
/var/lib/postgresql/data-bash: psql: 未找到命令docker exec -it pg18 psql -U postgres 进入容器很多人觉得国内镜像只是单纯提速工具,其实对 PG 迁移场景价值更大:
✅ 优势:
这次完整实测
registry.highgo 仓库 PostgreSQL 18.4-bookworm 镜像,整套流程从拉取、单机部署、生产 Compose 编排到排坑全部落地。
核心优势总结: 国内节点高速拉取、原生官方镜像安全合规、搭配 IvorySQL 一站式完成迁移对比测试。
实操重点提醒: 拉取镜像务必携带
-bookworm 后缀,必须挂载宿主机数据目录防止磁盘爆满,复制命令优先单行避免参数错乱。
本文所有操作及测试均基于 openEuler 操作系统环境完成,核心围绕 IvorySQL 社区镜像仓库
registry.highgo.com内 PostgreSQL 18.4-bookworm 兼容性验证展开。
请注意 IvorySQL 社区 PostgreSQL 镜像迭代较快,文中配置参数、命令行输出可能随新版本更新调整。生产部署前,请以 IvorySQL 官方文档、registry.highgo仓库最新 Tag 清单为准。
以上仅为个人运维实践总结,不代表社区官方观点,文中命令、密码仅作演示,线上环境请自定义高强度密码。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70042915/viewspace-3175859/ ,如需转载,请注明出处,否则将追究法律责任。