在Redhat主机上运行Oracle XE Docker镜像

我想让Oracle XE docker镜像在我的Redhat 7机器上运行,但Oracle在启动过程中失败,我可以在其警报日志中看到以下内容:

Exception [type: SIGSEGV, Address not mapped to object] [ADDR:0x7F80083C5FF8] [PC:0x20CB441, ksmem_free()+31] [flags: 0x0, count: 1] 

我可以在其他地方运行图像,但在Redhat服务器上失败。

最初我以为这可能是因为试图在Redhat上运行基于Ubuntu的映像,但是我尝试过使用基于Ubuntu 14,Ubuntu 16,Centos 6和Centos 7的不同映像,并且都有相同的问题。

这是“docker版本”的输出:

 Client: Version: 1.10.3 API version: 1.22 Go version: go1.5.3 Git commit: 20f81dd Built: Thu Mar 10 21:49:11 2016 OS/Arch: darwin/amd64 Server: Version: 1.10.3 API version: 1.22 Go version: go1.6.2 Git commit: 5206701-unsupported Built: Mon Aug 29 14:00:01 2016 OS/Arch: linux/amd64 

我不知道下一步该怎么走。 不幸的是,我别无select,只能在我的服务器上运行RHEL7,所以这不是一个选项。

如果有人有任何想法,我将不胜感激。

我设法通过卸载Redhat提供的docker(1.10版本)和安装由Docker自己提供的最新的1.12 RPM来实现上述function。

我不知道该修复是由于运行较晚的Docker,还是因为Redhat对Docker提供的二进制文件进行了一些更改。

我没有用RHEL做过这个,但是我可以用CentOS 7做到这一点,直接安装到主机上(足够近)。 然后,主机被设置为ssh,更新和升级,vsftp ftp / tls,selinux,docker等。在我有一个像样的基线之后,我知道我需要主机来支持我使用mkimage-yum.sh ( https://github.com/moby/moby/blob/master/contrib/mkimage-yum.sh )。 这是在下面的Dockerfile中引用的图像(centos-base-image:7.3.1611)。

 uname -a Linux CentOS7 3.10.0-514.16.1.el7.x86_64 #1 SMP Wed Apr 12 15:04:24 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux docker version Client: Version: 1.12.6 API version: 1.24 Package version: docker-common-1.12.6-16.el7.centos.x86_64 Go version: go1.7.4 Git commit: 3a094bd/1.12.6 Built: Fri Apr 14 13:46:13 2017 OS/Arch: linux/amd64 Server: Version: 1.12.6 API version: 1.24 Pack age version: docker-common-1.12.6-16.el7.centos.x86_64 Go version: go1.7.4 Git commit: 3a094bd/1.12.6 Built: Fri Apr 14 13:46:13 2017 OS/Arch: linux/amd64 

从这一点上,我创build了一个Dockerfile和一个在文件系统上相邻的资产目录。 在资产目录中,我解压缩了一个用于Linux x64的Oracle数据库速成版11g第2版的副本,并创build了一个setOracleEvn.sh文件,它将设置一些环境variables。 既然xe tar的内容是未压缩的,请更新Disk1 / response / xe.rsp文件以configuration默认端口和密码。

此时,您应该可以创build一个Dockerfile,它将asserts目录添加到容器并调用rpm并安装XE。 我使用提取的Disk1 / response / xe.rsp文件来configuration默认端口和密码,因为这是最简单的解决scheme(避免使用sed命令)。 如果你想要一个纯脚本的安装,你可以添加你想要的任何zip软件到yum安装阶段并执行操作。

我遇到了几个障碍:

  1. Docker的/ dev / shm默认为64MB,是为了小运行oracle的configuration。
    • 解决scheme: https : //github.com/moby/moby/pull/16168
    • 使用–shm-size = 2g执行构build运行命令
  2. selinux策略停止/etc/init.d/oracle-xe configure < response/xe.rsp执行成功的问题。
    • 解决scheme: https : //github.com/madhead/docker-oracle-xe/issues/6
    • 不幸的是:setenforce 0然后运行build命令。
  3. RPM -h(散列)选项打破了configuration过程。
    • 解决scheme: https : //stackoverflow.com/a/18110721/2583675
    • rpm -i oracle-xe-11.2.0-1.0.x86_64.rpm
  4. CMD中的所有内容都被执行后,容器往往会停止。
    • 解决scheme: Docker容器会在“docker run -d”后自动停止
    • 将tailf / dev / null添加到CMD的末尾,以便在前台运行某些内容。

以下是目录结构和文件信息:

ls -la从父目录

 drwxr-xr--. 3 user group ... assets -rwxr-xr--. 1 xxx xxx ... 1 11:22 Dockerfile 

ls -la资产/

 -rwxr-xr--. 1 xxx xxx ... exportOracleEnv.sh drwxr-xr--. 3 xxx xxx ... oracle-xe-11.2.0-1.0x86_64 

ls -la assets / oracle-xe-11.2.0-1.0x86_64

 drwxr-xr--. 4 xxx xxx ... Disk1 

ls -la assets / oracle-xe-11.2.0-1.0x86_64 / Disk1

 -rwxr-xr--. 1 xxx xxx ... oracle-xe-11.2.0-1.0.x86_64.rpm drwxr-xr--. 2 xxx xxx ... response drwxr-xr--. 2 xxx xxx ... upgrade 

vi response / xe.rsp – 确保除了http端口,tns监听端口,密码和y / n之外的任何其他信息,以便在启动时启动(如果文件中留有注释,则会中断)。

 8080 1521 welcome1 welcome1 y 

vi assets / exportOracleEnv.sh – 为每个bash设置oracle vars

 #!/bin/sh echo 'export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe' >> ~/.bashrc echo 'export PATH=$ORACLE_HOME/bin:$PATH' >> ~/.bashrc echo 'export ORACLE_SID=XE' >> ~/.bashrc echo 'export LISTENERS_ORA=/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora' >> ~/.bashrc 

Dockerfile有点忙,但是这是我能够使事情工作。 我一直在使用docker工人几天,所有的两个星期的Linux,所以原谅我没有最优雅的解决scheme。

 FROM centos-base-image:7.3.1611 #do not use $ in ENV: https://github.com/moby/moby/issues/25099 ENV _rpmLocation /assets/oracle-xe-11.2.0-1.0x86_64/Disk1 #installing epel because its required to resolve net-tools, your milage may very depending on what image your starting with. RUN yum -y install epel-release libaio bc flex && yum -y install net-tools kernel-devel #oracle uncompressed zip file provided in assets directory, also provides preconfigured response file ADD assets /assets WORKDIR ${_rpmLocation} # echo $ORACLE_HOME just because I like to know the process worked as I expect. The environment variables must be in place before running configure. RUN rpm -i oracle-xe-11.2.0-1.0.x86_64.rpm && /assets/exportOracleEnv.sh && echo $ORACLE_HOME # execute oracle-xe configure with response file RUN /etc/init.d/oracle-xe configure < response/xe.rsp WORKDIR / #clean up temp files, create ssh key and ensure known root password. #Finally set the final hostname to listen to all interfaces in tnsnames/listeners.ora otherwise the files will have the incorrect host name (it changes with every layer). RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd && echo "root:admin" | chpasswd && rm -rf ${_ASSETS} && \ sed -i -E "s/HOST = [^)]+/HOST = 0.0.0.0/g" /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora && \ sed -i -E "s/HOST = [^)]+/HOST = 0.0.0.0/g" /u01/app/oracle/product/11.2.0/xe/network/admin/tnsnames.ora #start sshd first (allows immediate connections via ssh) then db. leave tail running in forground CMD /sbin/sshd && /etc/init.d/oracle-xe start && tail -f /dev/null 

确保在生成时指定–shm-size(从Dockerfile目录运行)

 docker build --shm-size=2g -t centos-oracle:7.3.1611 . 

在运行容器时再次(–shm-size),确保-dti选项在CMD执行后保持运行CentOS 7容器

 docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611 

最后你应该可以通过ssh进行连接,确保ssh已经启动,你可以使用docker logs -f oracle-db来监视缺lessecdsa键的ssh输出。 注意:随着你的build筑物一遍又一遍的修复,你接受客户端的ssh证书并发出一个新的docker build命令后,你将需要删除旧的证书rm: remove regular file '/root/.ssh/known_hosts'? yes rm: remove regular file '/root/.ssh/known_hosts'? yes 。 在Dockerfile中将密码设置为admin

 ssh -p 5022 root@127.0.0.1 ... root@127.0.0.1's password: Authenticated to 127.0.0.1 ([127.0.0.1]:5022). 

一旦build立了ssh,你现在可以执行sqlplus,login为系统:welcome1

 [root@390856ad3b30 ~]# sqlplus SQL*Plus: Release 11.2.0.2.0 Production on Mon May 1 17:22:55 2017 Copyright (c) 1982, 2011, Oracle. All rights reserved. Enter user-name: system Enter password: Connected to: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production PL/SQL Release 11.2.0.2.0 - Production CORE 11.2.0.2.0 Production TNS for Linux: Version 11.2.0.2.0 - Production NLSRTL Version 11.2.0.2.0 - Production 

如果任何人都可以想出一个解决scheme,用oracle-xe停止configuration过程的selinux策略,那么终于可以解决这个问题了。