前言
最近有不少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
新建虚拟机
虚拟机硬件部分
点创建新的虚拟机
典型,下一步
选择安装光盘镜像,下一步
设置名称和虚拟机保存位置,下一步
设置磁盘大小40GB,下一步
点击自定义硬件
设置cpu2个,内存4096MB,网络桥接,复制物理网络,点关闭
点完成
虚拟机安装部分
虚拟机启动后,点向上方向键,切换到 Install Oracle Linux 8.4.0,回车
等一会儿,自动进入到语言选择界面,按你自己的习惯选择即可,一般建议用默认的英语
进入到这个界面,先点安装目的地
进来后直接点完成(这里应该是40GiB,此处只为截图演示)
然后点根密码,设置好后点完成
点开始安装
接下来就是漫长的等待了,完成后点重启系统
点许可证信息
打勾,点完成
点结束配置
点前进-前进-跳过,随便新建一个用户,注意不能是oracle,然后点前进
设置密码-前进,点开始使用
点右上角,进入有线,打开有线设置
点击齿轮
勾上自动连接,点确认
显示成这个样子即为连接成功,如果不是这样,请参考下面桥接模式的网络设置
桥接模式的网络设置
桥接模式需要另外设置虚拟网络,进入编辑-虚拟网络编辑器
点下面的更改设置
将桥接模式对应的网卡手动设置成你的主网卡
准备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自带的功能
但有时候会出现挂载后,在虚拟机内不显示的情况,所以还可以尝试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空间已经用得差不多了。
密码及参数
数据库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,上传下载就需要不少时间了)
另外,这个docker里没配置oml4py的相关环境
【ORACLE】在ORACLE数据库中启用机器学习功能(OML)以支持PYTHON脚本的运行,
改天看看怎么修改docker的构建脚本让它预先安装,目前还不确定这次用的oraclelinux:8-slim系统版本是否支持oml。精简版镜像构建的就这么大了(操作系统只有一百兆,其实最主要的原因是这个dockerfile没有使用多阶段构建的方式),如果直接用OL8的完整版构建,最后的docker镜像可是个庞然大物了