相同的 docker 镜像在 Windows 版 Docker 中有效,但在 Linux 上的 docker 中无效



我想实现什么 我想通过
sqlplus 连接到预言机容器中的预言机数据库

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

的数据库我做了什么

窗户

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:版本 11.2.0.2.0 生产于 周三 七月 19 07:28:45 2017

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

连接到: Oracle 数据库 11g 速成版版本 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:版本 11.2.0.2.0 生产于 周三 七月 19 07:34:16 2017

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

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

信息Linux系统:

码头工人信息

[xx@yy Docker]$ sudo docker 信息 容器: 1 正在运行: 1 已暂停: 0 已



停止: 0 图片:
33 服务器版本: 1.13.1
存储驱动程序: 设备
映射程序 池
名称: 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 同步 支持:真 已启用延迟删除:假 启用延迟删除:

假 延迟
删除 设备计数:0
数据循环文件:/var/lib/docker/devicemapper/devicemapper/data
警告:强烈建议不要在生产中使用环回设备。使用--storage-opt dm.thinpooldev指定自定义块存储设备。
元数据循环文件:/var/lib/docker/devicemapper/devicemapper/metadata 库版本:
1.02.137(2016-11-30)日志记录驱动程序:
日志式
Cgroup 驱动程序:systemd
插件:
卷:本地 网络:
网桥主机 macvlan 空覆盖 授权:
rhel-push-plugin 群:非活动 运行时:oci

runc
默认运行时:oci 初始化二进制:/
usr/libexec/docker/docker-init-current
containerd 版本:(预期:aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc 版本:不适用(预期:9df8b306d01f59d3a8029be411de015b7304dd8f)
init 版本:不适用(预期:949e6facb77383876aeff8a6944dde66b3089574)安全选项:seccomp 警告:您没有使用默认的 seccomp 配置文件:/etc/docker



/seccomp.json
selinux
内核版本:4.11.9-300.fc26.x86_64
操作系统:Fedora 26(工作站版)
OSType:linux
架构:x86_64
docker 钩子数量:3
处理器:8
总内存:7.776 GiB
名称:yy.domain.de
ID:4YVE:4FQ7:27SF:5JZJ:H6RA:P4H5:TK6O:FAGY:CKHS:RQGQ:3BDS:L7W7 Docker 根目录:/var/lib/docker
调试模式(客户端):假 调试模式(服务器):假 注册表:https://registry.fedoraproject.org/v1/
实验:假 不安全的注册表:127.0.0.0
/8
启用实时还原:假


注册表:
registry.fedoraproject.org
(安全)、registry.access.redhat.com(安全)、docker.io(安全)

码头工人日志

[xx@yy Docker]$ sudo docker logs cea28583cb1c
start Oracle Net Listener.
启动 Oracle Database 11g Express Edition 实例。
/usr/sbin/startup.sh: 忽略/docker-entrypoint-initdb.d/*

东风

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/firmware

统计

root@cea28583cb1c:/# stat/文件: '/'大小: 253 块: 0 IO 块: 4096 目录 设备: fd01h/64769d 索引节点: 131 链接: 22 访问: (0755/drwxr-xr-x) uid: ( 0/根) Gid: ( 0/根)访问: 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 status

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

版权所有 (c) 1991, 2011, 甲骨文. 保留所有权利。

连接到 (描述=(地址=(协议=IPC)(密钥=EXTPROC_FOR_XE)))侦
听器
的状态 别名侦听器 适用于
Linux 的版本 TNSLSNR: 版本 11.2.0.2.0 - 生产
开始日期 19-七月-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)))(

DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=CEA28583cb1c)(PORT=1521)))
)Services Summary...
服务 "PLSExtProc" 有 1 个实例。
实例"PLSExtProc",状态未知,此服务有 1 个处理程序...
命令已成功完成

我已经尝试过的

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

编辑按照要求,我尝试自己启动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 数据库 11g 速成版版本 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 = "AUTO">
undo_tablespace = "UNDOTBS1"remote_login_passwordfile= "EXCLUSIVE"调度程序 = "(协议=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">




终于解开了这个难题。

事实证明,SELinux是活跃的。我不知道几周前我是如何错过的。我肯定检查过,但也许我在容器内而不是主机。 所以我用 --privileged 标志运行容器,突然我可以连接到数据库。

感谢您的评论,很抱歉我在这里发布,您@jww是对的。我将确保将来只在这里发布编程问题。对不起。

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

sudo systemctl restart docker

sudo service docker restart

最新更新