Ubuntu 22.04 上用 Docker 部署 Oracle 19c 是当前最可行、最省事的路径,必须使用预编译第三方镜像(如 registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c),因其已解决 glibc/GCC/内核头文件 ABI 不兼容问题,而裸装或自建 Dockerfile 均会因链接 libasmclntsh19.ohso 失败卡死。

直接说结论:Ubuntu 22.04 上用 Docker 部署 Oracle 19c 是当前最可行、最省事的路径,但必须用预编译镜像(如 registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c),不能自己 build,也不能指望官方 oracle/database:19c 镜像——它不公开提供,且需要 Oracle 账户登录。
为什么不能裸装,也别自己 build 镜像
Oracle 19c 编译依赖 glibc 2.28、GCC 8–10 和旧版内核头文件,而 Ubuntu 22.04 自带 glibc 2.35 + GCC 11+,runInstaller 在链接 libasmclntsh19.ohso 时必然失败,报错类似 FATAL] Error in invoking target 'libasmclntsh19.ohso'。这不是缺包或权限问题,是 ABI 层级不兼容。自己写 Dockerfile 基于 ubuntu:22.04 安装 JDK、解压包、运行 runInstaller,结果一样卡死。
可选方案只剩两个:
- 用已预编译、验证可启动的第三方镜像(推荐)
- 换系统(如 Oracle Linux 8)再裸装——但这就脱离了“在 Ubuntu 22.04 上”的前提
拉取与运行 zhuyijun/oracle:19c 的关键参数
这个镜像已打包好所有依赖、补丁和初始化逻辑,但启动命令里几个参数漏掉一个,容器就会静默退出或监听失败:
-
-v /mydata/oracle/oradata:/opt/oracle/oradata必须挂载,且宿主机目录权限设为chmod 777 /mydata/oracle/oradata(Oracle 容器内以 UID 54321 的oracle用户写入,UID 映射不可控) -
-e ORACLE_PWD=orcl密码不能含@、$、#等 shell 特殊字符,否则listener.ora解析失败,docker logs -f oracle19c会卡在Starting Oracle Net Listener... -
-p 1521:1521和-p 5500:5500必须显式映射,后者是 EM Express 管理界面端口;若只映射 1521,远程客户端连得上但查不到 PDB 状态
完整命令示例:
docker run -d \ --name oracle19c \ --restart=unless-stopped \ -p 1521:1521 \ -p 5500:5500 \ -e ORACLE_SID=ORCLCDB \ -e ORACLE_PDB=ORCLPDB \ -e ORACLE_PWD=orcl \ -e ORACLE_CHARACTERSET=AL32UTF8 \ -v /mydata/oracle/oradata:/opt/oracle/oradata \ registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
如何确认数据库真正就绪,而不是“假启动”
容器 STATUS 显示 Up 2 minutes 不代表可用。Oracle 初始化是异步的,需盯日志输出确切信号:
- 执行
docker logs -ft oracle19c - 等出现连续
#########################分隔线,再看到ORACLE DATABASE IS READY TO USE!才算成功(该提示由镜像内setup.sh输出,非 Oracle 自带) - 若日志停在
Starting Oracle Net Listener...或反复报TNS-12541: No listener,大概率是ORACLE_PWD含非法字符,删容器重试
验证连接:
sqlplus sys/orcl@localhost:1521/ORCLCDB as sysdba
进库后执行 show pdbs,应能看到 ORCLPDB 处于 READ WRITE 状态。
远程访问不通?先查这三处
本地 sqlplus 能连 ≠ 远程能连。常见断点:
- 宿主机防火墙没放行 1521 端口:
sudo ufw allow 1521 - Docker 默认绑定到
127.0.0.1:1521,远程连不上;加--network host或确保-p 1521:1521未被其他服务占用 - Oracle 监听器注册的是容器内网 IP(如
172.17.0.2),远程客户端解析不到;解决方法是在tnsnames.ora中用(HOST = your-host-ip)替代(HOST = localhost),或改用 EZConnect 格式:sqlplus user/pass@host-ip:1521/ORCLPDB
真正容易被忽略的是:镜像内监听器默认只注册 CDB,PDB 需手动 ALTER PLUGGABLE DATABASE ORCLPDB SAVE STATE 才能在重启后自动打开——否则每次 docker restart oracle19c 后,PDB 是 MOUNTED 状态,远程连 PDB 就报 ORA-12514。











