前言
最近有不少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空間已經用得差不多了,容器運行需要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,上傳下載就需要不少時間了)

另外,這個docker里沒配置oml4py的相關環境
【ORACLE】在ORACLE數據庫中啟用機器學習功能(OML)以支持PYTHON腳本的運行,
改天看看怎么修改docker的構建腳本讓它預先安裝,目前還不確定這次用的oraclelinux:8-slim系統版本是否支持oml。精簡版鏡像構建的就這么大了(操作系統只有一百兆,其實最主要的原因是這個dockerfile沒有使用多階段構建的方式),如果直接用OL8的完整版構建,最后的docker鏡像可是個龐然大物了
- 本文作者: DarkAthena
- 本文鏈接: https://www.darkathena.top/archives/create-ol8-21-docker
- 版權聲明: 本博客所有文章除特別聲明外,均采用CC BY-NC-SA 3.0 許可協議。轉載請注明出處!




