我们正努力解决一个常见问题,即尝试为开发人员提供 Oracle 11g 实例以供测试。我们的标准构建代理基于 Ubuntu 12.04,但 Oracle 仅支持基于 RedHat 的操作系统。
网络上流传着一些关于在 Ubuntu 上安装 Oracle 的技巧,但它们似乎非常脆弱,而且很不可靠。
我们希望避免为了支持 Oracle 而不得不在 RedHat(/CentOS)上支持整个构建服务器 Puppet 配置,因此我开始怀疑我们是否可以使用 Docker 在我们的标准 Ubuntu 系统上提供 Oracle 所需的类似 RedHat 的环境。我们的想法是 Oracle 将在其自己的容器中运行,但其余的构建代理仍将在标准 Ubuntu 上运行,能够通过 TCP 与 Oracle 通信。
我知道 LXC 是什么,以及它们与 KVM/VirtualBox 等成熟虚拟化之间的区别,但我想知道是否仍然可行。
谢谢。
答案1
这是我的叉子:
- 将图像大小从 3.8G 减小到 825MB
- 数据库初始化已移出映像构建阶段
- 现在数据库在容器启动时初始化,没有安装任何数据库文件
- 容器外的媒体重用支持
- 添加了容器停止时的正常关闭功能
- 删除了 sshd
您可以在这里查看:
https://registry.hub.docker.com/u/sath89/oracle-xe-11g/
https://github.com/MaksymBilenko/docker-oracle-xe-11g
答案2
如果 Oracle Express 适合您:
- 下载 Oracle XE 11g rpm。
- 使用 alien 将 rpm 转换为 deb。
- 使用 dpkg-deb 命令“提取”deb 包。
- 修改 deb 脚本:
- 将 preinst 开头的 [ "$1" != "1" ] 更改为 [ "$1" != "install" ]。
- 将 postint 开头的 [ "$1" = "1" -o -z "$2" ] 更改为 [ "$1" = "configure" -a -z "$2" ]。
- 在 prerm 和 postrm 中将 [ "$1" = "0" ] 更改为 [ "$1" = "remove" -o "$1" = "purge" ]。
- 在 postinst 和 prerm 中将“chkconfig”更改为“update-rc.d”命令。
- 在初始化脚本中:删除一些系统命令的绝对路径;将 /etc/sysconfig/oracle-xe 修复为 /etc/default/oracle-xe;将 /var/lock/subsys 修复为 /var/lock;等等...
- 向控制文件添加依赖项:bc & libaio1。
- 使用 deb 命令构建 deb 包。
现在您有了一个 Oracle XE 11g 的 deb 包。安装它!
但还有一个问题:/dev/shm。修复方法如下:
- 注释 /etc/init/mounted-dev.conf 中的行:[ -e /dev/shm ] || ln -s /run/shm /dev/shm。
- 在/etc/fstab中添加一行:shm /dev/shm tmpfs size=2g 0 0
- rm -f /dev/shm; mkdir /dev/shm; 挂载 shm
启动 Oracle XE:service oracle-xe configure
答案3
我正在使用以下docker 镜像并取得良好的成功。
让它运行:
docker pull wnameless/oracle-xe-11g
和
docker run -d -p 49160:22 -p 49161:1521 wnameless/oracle-xe-11g
答案4
这绝对是一种可行的方法。我们使用 Ubuntu 14.04 作为主机,并在 Docker 容器中运行多个 Oracle 11g 实例以用于开发目的。
目前(Docker 1.5)11g 和 12c 的主要问题是 Docker 的硬编码共享内存限制问题 #2606。目前有两种解决方法:
docker run --privileged ...
在启动实例之前,使用更多内存重新挂载 /dev/shm- 自己修改并重建 Docker。对于这种情况,我整理了一个适用于 12c 的 Dockerfile,允许一次性创建映像:https://github.com/arpagaus/docker-oracle-12c