【ORACLE】从安装ORACLE LINUX 8开始构建一个ORACLE21C的docker镜像

前言

最近有不少ORACLE21C的特性想测试,但是它有些特性是基于ORACLE LINUX操作系统的,网上没搜到现成docker或者虚拟机镜像,而且oracle cloud免费的21c体验不对中国区信用卡用户开放(上次办的万事达只能用19c),于是我打算自己弄一个。

首先我尝试了Tim Hall提供的虚拟机构建方案,https://github.com/oraclebase/vagrant/tree/master/database/ol8_21,
但是我本机由于开启了虚拟化HYPER-V,和Oracle VM VirtualBox可能有冲突,在构建成功后怎么都开不了机,硬件加速设置里的各种组合都试过了,为此我还把本机的hyper-v功能给取消掉了,结果仍旧无法启动虚拟机。虽然oracle官方是说他的虚拟机兼容hyper-v,https://docs.oracle.com/en/virtualization/virtualbox/6.0/admin/hyperv-support.html,
但我实测应该还是有点问题,单独测试新建了个xp的虚拟机同样也是无法启动

VirtualBox Error: Call to NEMR0InitVMPart2 failed: 
VERR_NEM_INIT_FAILED (VERR_NEM_VM_CREATE_FAILED).

所以我就打算基于VMWARE全新安装一台ORACLE LINUX 8 虚拟机,再使用Tim Hall提供的docker构建方案构建一个镜像,这样就能做到干净,不影响我本机的环境了。(不用HYPER-V的原因是它的磁盘文件建了多大磁盘,虚拟机文件就多大,太浪费空间了,vmware的虚拟机文件大小是根据实际情况自动增加的,最大不超过设定的大小,还支持压缩释放空间)

vmware的安装就不说了,基本就是一路下一步,顶多有个虚拟化,其他没啥讲的,略过。

需要提前准备的东西

1.OracleLinux-R8-U4-x86_64-dvd.iso (https://yum.oracle.com/oracle-linux-isos.html)
2.apex_21.2_en.zip(https://www.oracle.com/tools/downloads/apex-downloads.html)
3.LINUX.X64_213000_db_home.zip(https://www.oracle.com/database/technologies/oracle-database-software-downloads.html)
4.这个目录及下面所有的文件 https://github.com/oraclebase/dockerfiles/tree/master/database/ol8_21

新建虚拟机

虚拟机硬件部分

点创建新的虚拟机
image.png
典型,下一步
image.png
选择安装光盘镜像,下一步
image.png
设置名称和虚拟机保存位置,下一步
image.png
设置磁盘大小40GB,下一步
image.png
点击自定义硬件
image.png
设置cpu2个,内存4096MB,网络桥接,复制物理网络,点关闭
image.png
点完成
image.png

虚拟机安装部分

虚拟机启动后,点向上方向键,切换到 Install Oracle Linux 8.4.0,回车
image.png
等一会儿,自动进入到语言选择界面,按你自己的习惯选择即可,一般建议用默认的英语
image.png
进入到这个界面,先点安装目的地
image.png
进来后直接点完成(这里应该是40GiB,此处只为截图演示)
image.png
然后点根密码,设置好后点完成
image.png

点开始安装
image.png
接下来就是漫长的等待了,完成后点重启系统
image.png
点许可证信息
image.png
打勾,点完成
image.png
点结束配置
image.png
点前进-前进-跳过,随便新建一个用户,注意不能是oracle,然后点前进
image.png
设置密码-前进,点开始使用
image.png
点右上角,进入有线,打开有线设置
image.png
点击齿轮
image.png
勾上自动连接,点确认
image.png
显示成这个样子即为连接成功,如果不是这样,请参考下面桥接模式的网络设置
image.png

桥接模式的网络设置

桥接模式需要另外设置虚拟网络,进入编辑-虚拟网络编辑器
image.png
点下面的更改设置
image.png
将桥接模式对应的网卡手动设置成你的主网卡

准备docker构建目录

将apex_21.2_en.zip、LINUX.X64_213000_db_home.zip 两个文件放到ol8_21/softwave目录里,
目录结构应该如下

ol8_21
├── Dockerfile
├── README.md
├── scripts
│   ├── healthcheck.sh
│   └── start.sh
└── software
    ├── apex_21.2_en.zip
    ├── LINUX.X64_213000_db_home.zip
    └── put_software_here.txt

挂载ol8_21这个目录到虚拟机,可以尝试使用VM自带的功能
image.png
但有时候会出现挂载后,在虚拟机内不显示的情况,所以还可以尝试windows开共享,然后虚拟机里挂载smb。
如果都嫌麻烦,可以直接sftp把这个文件夹给复制进虚拟机

安装docker环境及启动docker服务

打开shell工具,用root用户进入虚拟机,执行

dnf install -y dnf-utils zip unzip
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

dnf remove -y runc
dnf install -y docker-ce --nobest

然后执行下面两条,启动docker服务

systemctl enable docker.service
systemctl start docker.service

构建镜像

cd进入刚刚挂载的目录,执行(注意后面有个 .)

docker build -t ol8_21:latest .

如果中间网络断了或其他原因导致失败,需要清除过程文件,否则再次构建可能空间不足

docker system prune

最后显示

Successfully tagged ol8_21:latest

即为成功

最后docker镜像大小为15GB,此时虚拟机40GB空间已经用到35GB了。

运行镜像

docker run -dit --name ol8_21_con \
             -p 1521:1521 \
             --shm-size="1G" \
             ol8_21:latest

或者新建个文件夹将数据文件挂载到本地

mkdir -p ~/volumes/ol8_21_con_u02/

docker run -dit --name ol8_21_con \
             -p 1521:1521 \
             --shm-size="1G" \
             -v /u01/volumes/ol8_21_con_u02/:/u02 \
             ol8_21:latest

等几分钟后,就可登录数据库了,具体进度可监控日志

docker logs --follow ol8_21_con

这个时候虚拟机40G空间已经用得差不多了,容器运行需要5G空间。

密码及参数

数据库sys的默认密码配置在Dockfiles文件中,当然你也可以在构建前修改相关参数,比如要不要安装APEX

Define config (runtime) environment variables.
ENV ORACLE_SID=cdb1
SYS_PASSWORD=“SysPassword1”
PDB_NAME=“pdb1”
PDB_PASSWORD=“PdbPassword1”
INSTALL_APEX=“true”

后记

使用过程中遇到个奇怪的现象,我暂停虚拟机运行,再恢复,竟然无法在容器外再连上数据库了,虚拟机内容器还是在运行的,而且数据库也是正常启动的,容器内可以登录数据库。然后尝试stop容器再start,同样在容器外部无法连接。最终是重启了服务器再开启容器才连上。

我猜测这里存在某种机制会让docker的映射端口失效,但是检查docker port,端口映射还在那里;查看netstat -ntlp,端口也是处于监听状态。也就是说服务器和容器都没问题,是它们之间的沟通出了问题了(像极了前后端开发吵架~)。沿着这个思路,我尝试在此场景下,终止docker服务再启动docker服务和容器,果然通了。至于为什么暂停虚拟机再恢复虚拟机会导致这个问题,目前阶段我给不出明确原因,猜测可能是虚拟机暂停和恢复时并没有完整还原所有的数据,比如一些硬件地址,导致端口映射错位,毕竟端口号也只是个"名称"而已。

之后我又把这个镜像 push到了阿里云上,然后再在本机windows环境上pull下来,同样也可以使用,只是第一次启动的时候需要几分钟来初始化数据库。(15GB,上传下载就需要不少时间了)
image.png

另外,这个docker里没配置oml4py的相关环境
【ORACLE】在ORACLE数据库中启用机器学习功能(OML)以支持PYTHON脚本的运行
改天看看怎么修改docker的构建脚本让它预先安装,目前还不确定这次用的oraclelinux:8-slim系统版本是否支持oml。精简版镜像构建的就这么大了(操作系统只有一百兆,其实最主要的原因是这个dockerfile没有使用多阶段构建的方式),如果直接用OL8的完整版构建,最后的docker镜像可是个庞然大物了

 

posted on 2021-11-09 21:52  DarkAthena  阅读(370)  评论(0编辑  收藏  举报

导航