运行 两个 Docker Oracle 容器在一台 Windows 机器上
Running two Docker Oracle containers on one Windows Machine
1.我想要达到的目标
Using Docker for Windows (Docker version 19.03.12, build 48a66213fe) 我想 运行 并行两个独立的 Oracle 数据库。
我使用的图像来自 Oracle Container Registy 并且是 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
不同之处在于端口号、容器名称,我还添加了配置文件,如 documentation 中所述,该数据库具有不同的 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,所以我很确定它是正确的。
容器是运行ning:
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
包含 this pastebin 中的内容 - 它比第一个文件长一点。
我也试过了
多个不同的端口配置。
更改数据库的 SID
在不同的计算机上试过
有人知道为什么这看起来不可能吗?我在这上面花了很多时间,但仍然不知道为什么它不能 运行.
(抱歉,我还不能发表评论,所以我提出问题的唯一解决方案是发布“答案”)。
也许您的 2 个容器正在尝试使用相同的卷?
我想 Oracle 映像基于以下存储库:
https://github.com/oracle/docker-images/tree/master/OracleDatabase/SingleInstance
你能检查一下官方 Oracle Container Registry
图像是否没有硬编码数据的默认体积吗?通过指定默认 -v
选项和 docker 检查您的 运行 图像。
-v [<host mount point>:]/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 Github 中的脚本。
我认为更改 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(即端口不可用)。但如果你不使用它(像我一样),这将不是问题。
1.我想要达到的目标
Using Docker for Windows (Docker version 19.03.12, build 48a66213fe) 我想 运行 并行两个独立的 Oracle 数据库。 我使用的图像来自 Oracle Container Registy 并且是 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
不同之处在于端口号、容器名称,我还添加了配置文件,如 documentation 中所述,该数据库具有不同的 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,所以我很确定它是正确的。
容器是运行ning:
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
包含 this pastebin 中的内容 - 它比第一个文件长一点。
我也试过了
多个不同的端口配置。
更改数据库的 SID
在不同的计算机上试过
有人知道为什么这看起来不可能吗?我在这上面花了很多时间,但仍然不知道为什么它不能 运行.
(抱歉,我还不能发表评论,所以我提出问题的唯一解决方案是发布“答案”)。
也许您的 2 个容器正在尝试使用相同的卷?
我想 Oracle 映像基于以下存储库: https://github.com/oracle/docker-images/tree/master/OracleDatabase/SingleInstance
你能检查一下官方 Oracle Container Registry
图像是否没有硬编码数据的默认体积吗?通过指定默认 -v
选项和 docker 检查您的 运行 图像。
-v [<host mount point>:]/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 Github 中的脚本。
我认为更改 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(即端口不可用)。但如果你不使用它(像我一样),这将不是问题。