在 docker 上连接到 Oracle 映像"Got minus one from a read call, connect lapse 4 ms., Authentication lapse 0



当我尝试连接到一个oracle在docker容器,从oracle SQL开发人员,我得到错误"从读取调用中获得- 1,连接延迟4毫秒,身份验证延迟0毫秒。">

我打开oracle容器页面https://container-registry.oracle.com/ords/f?p=113:10::::::

我拉了快速版,我打算拉标准版,但它被删除了。

docker pull container-registry.oracle.com/database/express:latest

然后运行图像

docker run --name oracle-container -p 1521:5500 -e ORACLE_PWD=MyPasswd123 -e ORACLE_CHARACTERSET=AL32UTF8 -v /opt/oracle/oradata container-registry.oracle.com/database/express:latest

启动数据库,然后在命令行登录

docker exec -it oracle-container sqlplus sys/MyPasswd123@//localhost:1521/xe as sysdba
SQL*Plus: Release 21.0.0.0.0 - Production on Sun Dec 11 10:49:14 2022
Version 21.3.0.0.0
Copyright (c) 1982, 2021, Oracle.  All rights reserved.

Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
SQL>

运行命令没问题

SQL> SELECT sys_context('userenv','instance_name') FROM dual;
SYS_CONTEXT('USERENV','INSTANCE_NAME')
--------------------------------------------------------------------------------
XE

问题是试图从java或Oracle SQL Developer连接

我设置用户名sys为sysdba密码为MyPasswd123@主机名作为本地主机端口为1521SID为XE

我得到了错误。它令人困惑,因为我可以连接,使用命令行docker exec -it

您正在将企业管理器(端口5500)绑定到主机端口1521。

# fire up the database
docker run --name oracle-container -d --rm -p 1521:5500 -e ORACLE_PWD=MyPasswd123 -e ORACLE_CHARACTERSET=AL32UTF8  container-registry.oracle.c
om/database/express:latest
# query from inside the container
echo 'select dummy from dual;' | docker container exec -i oracle-container sqlplus -S system/MyPasswd123@localhost:1521/XE
D
-
X
# query from outside the container 
echo 'select dummy from dual;' | sqlplus -S system/MyPasswd123@localhost:1521/XE
ERROR:
ORA-12537: TNS:connection closed
# let's bind to the correct port
docker run --name oracle-container -d --rm -p 1521:1521 -e ORACLE_PWD=MyPasswd123 -e ORACLE_CHARACTERSET=AL32UTF8  container-registry.oracle.com/database/express:latest
# query from inside the container
echo 'select dummy from dual;' | docker container exec -i oracle-container sqlplus -S system/MyPasswd123@localhost:1521/XE
D
-
X
# query from outside the container. This time it works!
echo 'select dummy from dual;' | sqlplus -S system/MyPasswd123@localhost:1521/XE
D
-
X
祝你好运!

您可能还需要给它一点额外的时间。我没有等待足够长的时间来启动数据库。

您可以使用您正在使用的容器container-registry.oracle.com/database/express监视日志。

docker logs -f oracle-container

也可能想检查这个为我工作的容器gvenzl/oracle-xe: https://hub.docker.com/r/gvenzl/oracle-xe