【问题标题】:Same docker image works in Docker for Windows but not in docker on linux相同的 docker 映像适用于 Windows 的 Docker,但不适用于 linux 上的 docker
【发布时间】:2017-12-24 15:37:54
【问题描述】:

我想要实现的目标
我想通过 sqlplus 连接到 oracle 容器中的 oracle 数据库

我的问题是什么
我可以在 Docker for Windows 中连接到同一映像的数据库,但不能在 linux 主机上连接

我做了什么

Windows

c:\>docker pull wnameless/oracle-xe-11g
c:\>docker run -d -p 49160:22 -p 49161:1521 wnameless/oracle-xe-11g
c:\>docker exec -it f79f7aa5222c /bin/bash
root@f79f7aa5222c:/# sqlplus system/oracle

结果:

SQL*Plus:2017 年 7 月 19 日星期三 07:28:45 发布 11.2.0.2.0 生产版

版权所有 (c) 1982、2011、甲骨文。保留所有权利。

连接到: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64 位生产

Linux

[xx@yy Docker]$ sudo docker pull wnameless/oracle-xe-11g
[xx@yy Docker]$ sudo docker run --shm-size=2g -d -p 49160:22 -p 49161:1521 wnameless/oracle-xe-11g
[xx@yy Docker]$ sudo docker exec -it cea28583cb1c /bin/bash
root@cea28583cb1c:/# sqlplus system/oracle

结果:

SQL*Plus:2017 年 7 月 19 日星期三 07:34:16 发布 11.2.0.2.0 生产

版权所有 (c) 1982、2011、甲骨文。保留所有权利。

错误:
ORA-01034: ORACLE 不可用
ORA-27101: 共享内存领域不存在
Linux-x86_64 错误:2:没有这样的文件或目录
进程 ID:0
会话 ID:0 序列号:0

信息 Linux系统:

码头工人信息

[xx@yy 码头工人]$ sudo码头工人信息
容器:1
正在运行:1
暂停:0
已停止:0
图片:33
服务器版本:1.13.1
存储驱动程序:devicemapper
池名称:docker-8:17-4460587-pool
池块大小:65.54 kB
基本设备大小:10.74 GB
支持文件系统:xfs
数据文件:/dev/loop0
元数据文件:/dev/loop1
使用的数据空间:4.741 GB
数据空间总计:107.4 GB
可用数据空间:23.21 GB
使用的元数据空间:4.289 MB
元数据空间总计:2.147 GB
可用元数据空间:2.143 GB
精简池最小可用空间:10.74 GB
支持 Udev 同步:true
已启用延迟删除:false
已启用延迟删除:false
延迟删除设备计数:0
数据循环文件:/var/lib/docker/devicemapper/devicemapper/data
警告:强烈建议不要将环回设备用于生产用途。使用--storage-opt dm.thinpooldev 指定自定义块存储设备。
元数据循环文件:/var/lib/docker/devicemapper/devicemapper/metadata
库版本:1.02.137 (2016-11-30)
日志记录驱动程序:journald
Cgroup 驱动程序:systemd
插件:
音量:本地
网络:网桥主机 macvlan 空覆盖
授权:rhel-push-plugin
群:不活动
运行时:oci runc
默认运行时:oci
初始化二进制文件:/usr/libexec/docker/docker-init-current
容器版本:(预期:aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc 版本:不适用(预期:9df8b306d01f59d3a8029be411de015b7304dd8f)
初始化版本:N/A(预期:949e6facb77383876aeff8a6944dde66b3089574)
安全选项:
seccomp
警告:您没有使用默认的 seccomp 配置文件
配置文件:/etc/docker/seccomp.json
selinux
内核版本:4.11.9-300.fc26.x86_64
操作系统:Fedora 26(工作站版)
操作系统类型:linux
架构:x86_64
Docker Hook 数量:3
CPU:8
总内存:7.776 GiB
名称:yy.domain.de
编号:4YVE:4FQ7:27SF:5JZJ:H6RA:P4H5:TK6O:FAGY:CKHS:RQGQ:3BDS:L7W7
Docker 根目录:/var/lib/docker
调试模式(客户端):false
调试模式(服务器):false
注册表:https://registry.fedoraproject.org/v1/
实验性:错误
不安全的注册表:
127.0.0.0/8
启用实时恢复:false
注册表:registry.fedoraproject.org(安全)、registry.access.redhat.com(安全)、docker.io(安全)

Docker 日志

[xx@yy Docker]$ sudo docker logs cea28583cb1c
启动 Oracle 网络侦听器。
启动 Oracle Database 11g 快捷版实例。
/usr/sbin/startup.sh:忽略 /docker-entrypoint-initdb.d/*

df

root@cea28583cb1c:/# df -h
已使用的文件系统大小 可用 使用百分比 安装在
/dev/mapper/docker-8:17-4460587-f479be876efbf45834ea013ac119d63629944a2b315c7cbe7da3a22c1b1e566e 10G 1.9G 8.2G 19% /
tmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sdb1 110G 89G 17G 85% /etc/hosts
shm 2.0G 0 2.0G 0% /dev/shm
tmpfs 3.9G 0 3.9G 0% /sys/固件

统计

root@cea28583cb1c:/# stat /
文件:'/'
大小:253 块:0 IO 块:4096 目录
设备:fd01h/64769d 索引节点:131 链接:22
访问:(0755/drwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
访问:2017-07-11 07:12:36.676904944 +0000
修改:2017-07-19 07:33:44.026249772 +0000
更改:2017-07-19 07:33:44.216248030 +0000
出生: -

lsnrctrl

xx@yy:/etc/selinux# lsnrctl 状态

适用于 Linux 的 LSNRCTL:版本 11.2.0.2.0 - 2017 年 7 月 19 日 11:30:37 生产

版权所有 (c) 1991、2011、甲骨文。版权所有。

连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
LISTENER 的状态
别名 LISTENER
适用于 Linux 的版本 TNSLSNR:版本 11.2.0.2.0 - 生产
开始日期 19-JUL-2017 07:33:46
正常运行时间 0 天 3 小时。 56 分钟。 51 秒
跟踪级别关闭
安全开启:本地操作系统身份验证
SNMP 关闭
默认服务 XE
监听器参数文件 /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora
侦听器日志文件 /u01/app/oracle/diag/tnslsnr/cea28583cb1c/listener/alert/log.xml
监听端点总结...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE)))
(描述=(地址=(协议=tcp)(主机=cea28583cb1c)(端口=1521)))
服务总结...
服务“PLSExtProc”有 1 个实例。
实例“PLSExtProc”,状态 UNKNOWN,有 1 个用于此服务的处理程序...
命令成功完成

我已经尝试过的

我尝试了两个用户,oracle 和 root。
我将 /u01/app/oracle 的权限更改为 755
我检查了 selinux,这似乎没有激活/安装。至少这是 docker info 告诉我的,我找不到 sestatus 命令,而 /etc/selinux 只包含 semanage.conf。
我尝试了几个不同的 oracle 映像,每个容器的结果都相同。

编辑 根据要求,我尝试自己启动 oracle 服务:

service oracle-xe start

alert_XE.log 的结果:

启动 ORACLE 实例(正常)
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
挑选的无闩锁SCN方案3
使用 LOG_ARCHIVE_DEST_1 参数默认值作为 USE_DB_RECOVERY_FILE_DEST
撤消保留的自动调整已打开。
IMODE=BR
ILAT =19
LICENSE_MAX_USERS = 0
SYS 审核已禁用
启动:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64 位生产。
使用服务器端 spfile /u01/app/oracle/product/11.2.0/xe/dbs/spfileXE.ora 中的参数设置
具有非默认值的系统参数:
会话 = 176
sga_target = 576M
control_files = "/u01/app/oracle/oradata/XE/control.dbf"
兼容 =“11.2.0.0.0”
db_recovery_file_dest = "/u01/app/oracle/fast_recovery_area"
db_recovery_file_dest_size=10G
undo_management = "自动"
undo_tablespace = "UNDOTBS1"
remote_login_passwordfile=“独家”
调度程序 = "(PROTOCOL=TCP) (SERVICE=XEXDB)"
shared_servers = 4
job_queue_processes = 4
audit_file_dest = "/u01/app/oracle/admin/XE/adump"
db_name = "XE"
open_cursors = 300
pga_aggregate_target = 195840K
diagnostic_dest = "/u01/app/oracle"

【问题讨论】:

  • 这是题外话,但目前尚不清楚它属于 DBA 还是 SU。您使用的是遗赠连接,而不是 TNS,因此侦听器输出不相关 - 除了它显示没有 XE 服务,这只是确认数据库已关闭。所以在“开始……实例”之后出了点问题。您需要查看 Oracle 警报日志以了解它为什么没有启动,或者正在启动然后关闭。您也可以尝试手动启动它,看看会发生什么。
  • 谢谢。在尝试自己启动服务后,我编辑了帖子并添加了警报日志。
  • 看起来像 --shm-size 的问题。不使用会怎样?
  • OK,SQL*Plus 现在也能正常工作还是给出同样的错误; lsnrctl services 是否显示 XE 服务? SGA 和 PGA 目标看起来会超出您分配的 RAM;为什么你在两个环境中使用不同的run 标志?
  • shm-size 没有任何区别。我刚刚在几篇文章中读到 oracle 需要更大的共享内存大小,所以我也尝试了这个(在有人要求这样做之前:))。与 lsnrctl 状态相比,lsnrctl services 没有显示任何新内容。它只是列出了 EXTPROC_FOR_XE 条目(服务 PLSExtProc)。编辑:为了更清楚一点:离开 shm-size 会导致同样的问题。没有它,它只保留 64mb 共享内存。

标签: linux windows oracle docker


【解决方案1】:

终于解决了这个难题。

原来 SELinux 是活跃的。我不知道几周前我是怎么错过的。我确实检查过,但也许我在容器内而不是主机内。 所以我用 --privileged 标志运行容器,突然我可以连接到数据库。

感谢您的 cmets,很抱歉我将其发布在这里,您是对的 @jww。我将确保将来只在此处发布编程问题。很抱歉。

【讨论】:

    【解决方案2】:

    您还可以编辑/etc/sysconfig/docker 并从通常默认添加的选项中删除--selinux-enabled。然后重启docker服务:

    sudo systemctl restart docker
    

    sudo service docker restart
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2020-06-12
      • 1970-01-01
      • 2018-03-09
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多