AWS EC2 Docker部署Oracle 19C自定义端口不生效连接失败问题
问题原因
你连接失败的核心原因有两点:
- 你使用的
heartu41/oracle19c镜像默认配置中,Oracle TNS监听器只会监听容器内部的1521端口,不会根据docker启动参数自动修改内部监听端口,你的netstat输出已经验证了这点——容器内1522端口没有任何服务处于监听状态。 - Docker端口映射参数
-p的规则是宿主机端口:容器内服务监听端口,你之前写的-p 1522:1522是将宿主机1522端口的流量转发到容器的1522端口,和容器内实际监听的1521端口不匹配,自然无法建立连接。
解决方案
方案1:直接调整端口映射规则(推荐,无额外配置)
不需要修改Oracle任何内部配置,只需要把映射目标指向容器内实际监听的1521端口即可,操作步骤:
- 删除之前创建的异常容器:
docker rm -f oracle
- 用修正后的端口映射参数启动新容器,比如你要对外使用1522端口提供服务,就把映射参数改成
1522:1521:
docker run -d -p 1522:1521 -e ORACLE_PDB=orcl -e ORACLE_PWD=myPassword_1 --name oracle heartu41/oracle19c
- 等待数据库初始化完成(通常需要5-10分钟,可以用
docker logs -f oracle查看初始化进度),同时确认EC2实例的安全组已经放开入方向1522端口的访问权限,之后用SQL Developer连接时,主机填EC2公网IP,端口填1522即可正常访问。
方案2:修改容器内Oracle监听端口(非必要不推荐)
如果你确实需要让Oracle服务本身在容器内的1522端口监听,需要额外修改监听器配置:
- 按你之前的参数启动容器:
docker run -d -p 1522:1522 -e ORACLE_PDB=orcl -e ORACLE_PWD=myPassword_1 --name oracle heartu41/oracle19c
- 进入容器内部:
docker exec -it oracle bash
- 切换到oracle用户,找到
$ORACLE_HOME/network/admin/路径下的listener.ora和tnsnames.ora两个配置文件,将文件中所有标注1521端口的配置项改为1522。 - 重启容器内的Oracle监听器服务,或者直接重启整个容器让配置生效:
docker restart oracle
- 再次进入容器执行
netstat -an,确认1522端口处于LISTEN状态后即可正常连接。
这种方案需要改动Oracle原生监听配置,操作失误很容易导致监听器启动失败,没有特殊需求不建议使用。
内容的提问来源于stack exchange,提问作者Arpit Agrawal
相关产品推荐
相关产品推荐

