【问题标题】:Can not connect to oracle outside docker container无法连接到 docker 容器外的 oracle
【发布时间】:2021-05-30 16:53:57
【问题描述】:

我已经为 oracle 19c 创建了一个图像。我已经使用以下命令启动了我的容器。

docker run --name oracledb -d -p 1527:1521 -p 5700:5500 -e ORACLE_PWD=password1 -e ORACLE_CHARACTERSET=AL32UTF8 -v /d/docker-code/oracle-data oracle/database:19.3.0-ee

创建容器后,我可以登录容器。我可以在容器内使用以下命令进行连接。

sqlplus system/password1@172.17.0.2:1527/ORCLCDB

在容器之外,从 cmd,我无法连接到那个 oracle 实例。

注意:我已经在 windows 机器上的默认端口 1521 上安装了 oracle。

listener.ora

LISTENER =
(DESCRIPTION_LIST =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.17.0.2)(PORT = 1527))
  )
)

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = ORCLCDB)
      (ORACLE_HOME = /opt/oracle/product/19c/dbhome_1)
      (SID_NAME = ORCLCDB)
    )
   )


DEDICATED_THROUGH_BROKER_LISTENER=OFF
DIAG_ADR_ENABLED = off

tnsnames.ora

ORCLCDB=172.17.0.2:1527/ORCLCDB
ORCLPDB1=
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.17.0.2)(PORT = 1527))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCLPDB1)
    )
  )

我无法从 SQL Developer 或 CMD 进行连接。当我尝试访问 docker 容器外部时,我会遇到超时错误。

ERROR:
ORA-12170: TNS:Connect timeout occurred

请指导我解决此问题。

提前致谢。

【问题讨论】:

  • 您是否在 Windows 网络 IP 中添加了 172.17.0.2?我的意思是你能ping172.17.0.2吗?
  • 172.17.0.2 我无法ping通这个IP。我没有添加 Windows 网络 IP。我该如何添加这个?
  • 以管理员身份运行命令提示符程序,然后运行ipconfig查看是否存在。我对 Windows 中的 Docker 还不够熟悉,但在 Linux 中它增加了。
  • 您的容器端口是 1527,因此:-p [host_port]:[container_port] -> -p 1521:1527。但由于 1521 已经被占用,所以 make 是别的东西-> -p 1522:1527。现在可以连接了:sqlplus system/password1@localhost:1522/ORCLCDB
  • @BjarteBrandt - 我需要更改 docker 文件中的某些内容还是在为 oracle 19c 创建映像时?截至目前,我在创建 docker 映像时已将端口值从 1521 更改为 1527。通过您建议的更改,我仍然无法连接到容器外部。在 docker 容器内,我可以连接到这个,sqlplus system/password1@localhost:1527/ORCLCDB 但在 docker 容器之外,我无法连接到这个,sqlplus system/password1@localhost:1522/ORCLCDB

标签: oracle docker oracle-sqldeveloper docker-for-windows oracle19c


【解决方案1】:

确保所有容器网络接口都在侦听数据库流量,因此0.0.0.0。不要硬编码 docker bridge 网络地址 (172..),因为该地址将在容器启动时分配。只需坚持使用容器本地的默认端口 1521。这个端口 - 1521 - 是容器本地的,不暴露给主机操作系统。您将此端口发布到您决定使用哪个端口的主机操作系统,因此-p 1522:1521

LISTENER =
(DESCRIPTION_LIST =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
  )
)

现在您可以通过发出以下命令在主机操作系统上启动容器:

docker run --name oracledb -d -p 1522:1521 -p 5700:5500 -e ORACLE_PWD=password1 -e ORACLE_CHARACTERSET=AL32UTF8 -v /d/docker-code/oracle-data oracle/database:19.3.0-ee

现在应该可以工作了

sqlplus system/password1@localhost:1522/ORCLCDB

提示。您现在可以从 Docker Hub 中提取 Oracle XE 18c。如果您仍然无法使用已构建的映像进行连接,我建议您测试此映像。

docker run -d -p 1522:1521 --rm -e ORACLE_PASSWORD=Welcome_1 -v oracle-volume:/opt/oracle/oradata gvenzl/oracle-xe

docker container ls
CONTAINER ID   IMAGE              COMMAND                  CREATED             STATUS             PORTS                    NAMES
97ce7cd3d7ca   gvenzl/oracle-xe   "container-entrypoin…"   About an hour ago   Up About an hour   0.0.0.0:1522->1521/tcp   elegant_borg

sqlplus system/Welcome_1@localhost:1522/XE

SQL*Plus: Release 19.0.0.0.0 - Production on Mon May 31 10:21:18 2021
Version 19.8.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Last Successful login time: Mon May 31 2021 10:20:19 +02:00

Connected to:
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0

system@XE> set echo on
system@XE> @pdbs
system@XE>
system@XE> col con_id format 999
system@XE> col dbid format 99999999999999999
system@XE> col name format a30
system@XE> col open_mode format a10
system@XE> col open_time format a38
system@XE>
system@XE> select p1.con_id, p1.dbid, p1.name, p2.status, p1.open_mode, p1.open_time
  2  from
  3    v$pdbs p1 join dba_pdbs p2 on (p1.con_id = p2.con_id);

CON_ID               DBID NAME                           STATUS     OPEN_MODE  OPEN_TIME
------ ------------------ ------------------------------ ---------- ---------- --------------------------------------
     2         1957965804 PDB$SEED                       NORMAL     READ ONLY  31.05.2021 06:54:00474 AM +00:00
     3         4267393270 XEPDB1                         NORMAL     READ WRITE 31.05.2021 06:54:01229 AM +00:00

2 rows selected.

system@XE>

祝你好运!

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 2021-06-18
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2020-06-12
    • 2022-01-07
    相关资源
    最近更新 更多