[Docker][Oracle]在 Windows 下利用 Docker 安裝 Oracle 資料庫

以往為了要測試 Oracle , 要弄 VM 來安裝 Linux , 然後再來使用相關指令安裝 Oracle , 現在利用 Docker 技術可以讓整個程序方便多了。

以往較少使用到 Oracle 的環境,最近剛好要測試 SSIS 和 SQL 語法 的問題,逼不得已要弄一個 Oracle 的環境,但以往只熟悉 Mandrake,忽然要找其他 Linux 來安裝,就覺得有點麻煩。但不想要直接在我自己的電腦上來安裝,怕後續要移除又很難清除乾淨,就想到用 Docker 來測試看看,沒有想到居然還蠻方便的,但是安裝過程有點小卡關,因此就整理一下自己安裝的筆記,免得後續又忘記了。

首先我先安裝 Docker Desktop ( Docker ),基本上這個安裝沒有甚麼困難,這裡我會使用預設的 WSL2 來做使用

當有 Docker 可以運行的環境之後,接下來就要建立 Oracle 的 Image,目前會比較建議自己抓環境來 Build,這一點 Oracle 雖然沒有直接提供 Image 讓大家來使用,但倒是將建立的方式放在 GitHub ( GitHub )上面,大家可以連到該網址將 docker 的佈署設定給複製回來使用。

這一包資料會有點多,基本上下載回來之後,我們可以解開這個 zip 的檔案,在這裏面的 docker-images\OracleDatabase\SingleInstance 的目錄下會有我們想要的資料,但因為他是 Linux 的 Bash script 的腳本,因此這裡我們就可以利用 WSL 的環境來執行這個腳本。

但是這個有個比較特別的地方,因為 Oracle 從 12 以後的版本就支援 Container Database 的架構,而且預設的也是建立 CDB 的架構,但對於我這種之前是學 Oracle 8 的人來說,不是那麼習慣 CDB 的環境,因此在這裡我們會先修改一下 Oracle 預設建立資料庫的範本,來做一點調整,這樣後續建立起資料庫會比較方便一點,當然如果您是熟悉 CDB 架構的人,就可以不用這樣的調整。

下面我是要建立的測試環境是 19.3.0 的版本,因此我就會到 docker-images\OracleDatabase\SingleInstance\dockerfiles\19.3.0 的目錄下,找到「dbca.rsp.tmpl」,然後修改這個檔案裏面的設定,將 「createAsContainerDatabase」 設定為 false ,並且將「numberOfPDBs」設定為 0,也把 「pdbname」 和 「pdbAdminPassword」 的設定給註解。下面就是我修改後的設定。但如果您要使用的不是這個版本,那就到對應的目錄下面,也都會有一個同名的檔案,把設定給修改就好了。

createAsContainerDatabase=false
numberOfPDBs=0
#pdbName=###ORACLE_PDB###
#pdbAdminPassword=###ORACLE_PWD###

接著還有一個 createDB.sh 的檔案也要修改,將有關 PDB 的設定給註解起來

而另外一個修正雖然不大影響,但是避免出現錯誤訊息,要將 checkDBStatus.sh 裡面 , 有關於本來是查詢 v\$pdbs 的部分給改成 v\$database

完成上述的相關修正,我們就要來建立 Docker Images,按照目前所拿到的 Oracle 相關腳本,其實他的做法是從 Base Image 裡面,將相關的腳本和 Oracle  Database 的安裝程式複製進去,然後進行資料庫的建立,而從 GitHub 上面所下載回來的只有安裝的腳本,並沒有 Oracle Database 的安裝程式,所以我們要去 Oracle 網站上將 Oracle Database 的安裝程式給下載回來放到目錄下。

以下是兩個我測試會用到的版本 

Oracle Database 19c Download for Linux x86-64
Oracle Database 21c Download for Linux x86-64

下載回來將檔案跟其他腳本放在一起就可以了

完成前置作業之後,接下來我們就可以在 WSL 環境來建立 Oracle Database 的 Docker Image 了。我們要先在 WSL 的環境下,將目錄切換到  「docker-images\OracleDatabase\SingleInstance\dockerfiles」之下,此時就可以用  buildContainerImage.sh 這個腳本來建立了。這裡 -v 是用來指定 Oracle 的版本,-s 指定安裝的 Standard 版本, -t 則是指定 tag 的名稱 

./buildContainerImage.sh -v 19.3.0 -s -t oracle/database:19.3.0-nocdb

因為我的環境並不是很優,所以大概會花費五分鐘就可以完成 Image 建立

透過 Docker Desktop 上面也可以查看到剛剛建立好的 Image

但這並沒有結束喔 , 到這裡只是建立好 Image , 我們還要去建立 Container。這裡我就用 docker-compose 來做處理,這樣就算以後要修改會比較方便一些,因此先產生一個 docker-compose.yml 的檔案。

services:
  db:
    image:  oracle/database:19.3.0-nocdb # image_name:tag
    container_name: oracle # Container name
    environment:
      ORACLE_SID: oracle
      ORACLE_PWD: <密碼> 
      ORACLE_CHARACTERSET: AL32UTF8
    ports:
      - 1521:1521
      - 5500:5500
    tty: true

這裡指定剛剛前面所建立的 Image ,就可以用以下指令來建立 Container

docker-compose up -d

雖然看畫面好像很快就建立起來,但是那是個假象。此時我們到 Docker Desktop 下面,就可以看到有建立這個 Container。

但是如果此時我用 SQL Developer 去連線 Oracle ,則會出現以下錯誤

因此我們在 Container 下面那個 Image 點擊一下,會從以下 Logs 的地方看到,第一次啟動的過程中,會開始真正建立資料庫。在前面建立 Image 的時候,其實只有把相關檔案複製進去,並沒有真正把資料庫給建立起來。

因此這裡我們就稍等一下,大概幾分鐘之後就可以了,等看到「Completing Database Creation」的訊息,就表示資料庫已經建立完成了。

此時我們再使用 SQL Developer 登入,就會發現果然可以正常登入了,而此時我們檢查是否是在 CDB 的模式下,也確認不是。

後記 : 這次的經驗讓我覺得其實也還蠻不錯的 , 雖然有些過程可能還需要再多熟悉一下 , 像是在 CDB 模式下的相關操作 , 但就這等下次有空再來練習一下了 , 否則都快 20 年沒有摸 Oracle 了 , 還需要多花點時間才有辦法稍微恢復一點記憶。