在一台Windows计算机上运行两个Docker Oracle容器

在一台Windows计算机上运行两个Docker Oracle容器,oracle,docker,devops,Oracle,Docker,Devops,1。我正在努力实现的目标 使用Docker for Windows(Docker版本19.03.12,构建48a66213fe),我希望在两个独立的Oracle数据库中并行运行。 我使用的图像来自Oracle数据库标准版2 2。我是如何实现这一目标的 我启动了一个容器,它工作正常(使用默认设置)。运行命令是: docker run -d -p 1521:1521 -p 5500:5500 --shm-size="8g" --name=oracle --restart=alwa

1。我正在努力实现的目标

使用Docker for Windows(Docker版本19.03.12,构建48a66213fe),我希望在两个独立的Oracle数据库中并行运行。 我使用的图像来自Oracle数据库标准版2

2。我是如何实现这一目标的

我启动了一个容器,它工作正常(使用默认设置)。运行命令是:

docker run -d -p 1521:1521 -p 5500:5500 --shm-size="8g" --name=oracle --restart=always container-registry.oracle.com/database/standard
这一个非常好用。我可以使用我的应用程序或数据库管理工具连接到数据库

然后,我想使用相同的图像启动不同的容器,并使用以下命令:

docker run -d -p 1527:1521 -p 5507:5500 --shm-size="8g" --name=OraHib --restart=always container-registry.oracle.com/database/standard
不同之处在于端口号、容器名称以及我添加的配置文件,如中所述,该数据库的SID不同

3。结果如何

在等待新容器启动四分之一秒后,我尝试连接到新数据库,收到错误:

Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
当然,仔细检查了SID,所以我很确定它是正确的

容器正在运行:

CONTAINER ID        IMAGE                                             COMMAND                  CREATED             STATUS              PORTS                                            NAMES
6047148f17cd        container-registry.oracle.com/database/standard   "/bin/sh -c '/bin/ba…"   15 minutes ago      Up 15 minutes       0.0.0.0:1527->1521/tcp, 0.0.0.0:5507->5500/tcp   OraHib
694120faf51c        container-registry.oracle.com/database/standard   "/bin/sh -c '/bin/ba…"   4 weeks ago         Up 3 hours          0.0.0.0:1521->1521/tcp, 0.0.0.0:5500->5500/tcp   oracle
docker日志中的内容:

docker logs OraHib
User check : root.
Setup Oracle Database
Oracle Database 12.1.0.2 Setup
Tue Oct 6 11:48:21 UTC 2020

Check parameters ......
log file is : /home/oracle/setup/log/paramChk.log
paramChk.sh is done at 0 sec

untar DB bits ......
log file is : /home/oracle/setup/log/untarDB.log
untarDB.sh is done at 117 sec

config DB ......
log file is : /home/oracle/setup/log/configDB.log
ERROR : config DB failed, please check log /home/oracle/setup/log/configDB.log for details!
Tue Oct 6 11:48:21 UTC 2020
User check : root.
Setup Oracle Database
在提到的
configDB.log
文件中有:

Start Docker DB configuration
Call configDBora.sh to configure as oracle user
Argument(s) Error... Patch not present in the Oracle Home, Rollback cannot proceed
If the patch was applied using -no_inventory option, use -ph option
to specify the patch shiphome location. Use 'opatch rollback -help'
to get more information.

ERROR : ORA- errors detected, config DB ora failed, please check log /home/oracle/setup/log/configDBora.log for details!
Docker DB configuration failed ...
最后一个日志文件
configDBora.log
包含中的内容-它比第一个日志文件稍长

我也尝试过的
多个不同的端口配置。
更改数据库的SID
在不同的计算机上尝试

有人知道为什么这看起来不可能吗?我花了很多时间在这个问题上,但仍然不知道为什么它不能运行。

(很抱歉,我还不能发表评论,所以我唯一的解决办法就是发布一个“答案”)

可能您的两个容器试图使用相同的卷

我认为Oracle映像基于以下回购协议:

您是否可以检查官方的
Oracle容器注册表
图像是否没有为数据硬编码默认卷;通过在运行图像上使用docker inspect指定默认的
-v
选项

-v[:]/opt/oracle/oradata


更新

此图像中似乎尚未启用此功能。 如果查看正在运行的容器中的安装脚本,我们可以看到侦听器端口是用1521硬编码的,并且不使用公开的端口:

su oracle
vi /home/oracle/setup/configDBora.sh
端口是硬编码的:

[...]
echo "SSL_VERSION = 1.0"  >> $LSNR_ORA
# tnsnames.ora
TNS_ORA=$ORACLE_HOME/network/admin/tnsnames.ora
echo "$DB_SID = \
  (DESCRIPTION = \
    (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) \
    (CONNECT_DATA = \
      (SERVER = DEDICATED) \
      (SERVICE_NAME = $DB_SID.$DB_DOMAIN) \
    ) \
  ) \
" >> $TNS_ORA
echo "$DB_PDB = \
  (DESCRIPTION = \
    (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) \
    (CONNECT_DATA = \
      (SERVER = DEDICATED) \
      (SERVICE_NAME = $DB_PDB.$DB_DOMAIN) \
[...]

我建议您尝试使用另一个版本,或者使用中的脚本。

我认为在更改Oracle Enterprise manager的默认端口时,映像有一个错误。 只要省略它,它就会起作用:

docker run -d -p 1527:1521 --shm-size="8g" --name=OraHib
--restart=always container-registry.oracle.com/database/standard

docker run -d -p 1528:1521 --shm-size="8g" --name=OraHib2
--restart=always container-registry.oracle.com/database/standard

这并不完美,因为这将停用EM(ie端口不可用)。但是如果你不使用它(像我一样),这不会是一个问题。

有时我注意到一个Windows容器无法到达另一个Windows容器。我不知道为什么,但在主机上重新启动Docker windows服务,然后再次启动容器有助于同一台计算机上的windows容器之间的相互通信。感谢您的评论,但我不需要它们彼此看到。我需要其他东西才能连接到它们。我给了你评论的能力;-)不幸的是,我无法从
docker inspect
共享整个JSON,但我在那里看不到任何与卷相关的信息,除了:
“Volumes”:null,
@zycho感谢您的升级!我正在我的电脑上下载图像,并测试我是否可以重现你的问题。我遇到了与你相同的问题。我将更新我的“应答”您好,您是对的,侦听器设置为侦听容器内的1521端口,但我认为您可以使用
docker run
命令中的
-p:1521
选项将此端口映射到主机中的任何其他端口。我在主机上设置的任何端口上连接到容器上的侦听器都没有问题。侦听器就在那个里,但问题是并没有启动的数据库可以路由到。