当前位置: 首页 > 知识库问答 >
问题:

无法在docker容器外部连接到oracle

乌骏
2023-03-14

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

docker-run-name oracledb-d-p 1527:1521-p 5700:5500-e ORACLE\u PWD=password1-e ORACLE\u CHARACTERSET=AL32UTF8-v/d/docker-code/ORACLE-data-ORACLE/database:19.3.0-ee

创建容器后,我可以登录容器。我能够在容器内连接以下命令。

sqlplus系统/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

特斯奈姆斯·奥拉

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

请指导我解决这个问题。

提前谢谢。

共有1个答案

卫高明
2023-03-14

确保所有容器网络接口都在侦听数据库流量,因此0.0.0.0。不要硬编码docker网桥网络地址(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>

祝你好运!

 类似资料:
  • 要运行测试文件,Flask应用程序需要连接到Redis。我尝试将这些URL用于redis主机,如localhost:6379,redis:6379,0.0.0.0:6379,但都没有用。他们都告诉我连接错误或连接拒绝。 知道如何从jenkins docker容器中连接到redis吗?

  • 我已经创建了一个MySQL数据库的映像,并在容器中运行它。我希望它在端口3406/3407上运行,因此我调用docker run命令如下所示: 如果我看我的容器,它看起来是这样的: 我非常想连接到我的数据库现在,但我似乎不能使我的URL工作。 这是我的URL的样子:

  • 问题内容: 我有用于创建mysql映像的docker- compose文件,并将端口公开给3306,但是当我尝试安装CMS时,出现了无法连接数据库的错误。我尝试扫描端口3306,并向我显示它已打开,因此mysql正在运行。 为什么两个Docker容器彼此看不到? 这是我的docker-compose文件: 问题答案: 要连接到数据库,请使用您作为主机名提供的链接/别名。因此,您的CMS可以使用主机

  • 我在docker容器中的服务器上有Postgresql。如何从外部连接到它,即从本地计算机连接到它?我应该应用什么设置来允许它?

  • 我正在使用以下代码,但我的本地站点无法连接到DB docker run--name db-p 90:3306--restart=always--network wp mysql network-e mysql\u ROOT\u PASSWORD=ROOT-e mysql\u DATABASE=wordpress-e mysql\u USER=wpuser-e mysql\u PASSWORD=P@

  • 我有zipkin服务器作为Spring Boot应用程序运行。我已经将jar导出到docker容器。 我已经探索过这个环节。