自己對 Oracle 非常不熟悉,所以每次要把 Oracle 環境建置起來的時候總要花很多時間。 但是自從 Oracle 有提供 Docker 的映像檔後,什麼都變容易了呢。 所以今天就來記錄一下怎麼使用 Docker 將 Oracle 環境架起來吧。

當你找到 Docker Hub - Oracle Database Enterprise Edition 提供的映像檔時候,竟然有一個 Proceed to Checkout 的按鈕,跟一般的直接 pull 的訊息不一樣。 那是因為 Oracle 將映像檔放在 Docker Store 裡。(Docker Store 是 Docker 提供給廠商能夠進行商業行為的 Repository)

Proceed to CheckoutProceed to Checkout

畢竟 Oracle 對 License 非常的重視,所以才這樣子吧。 不過竟然要使用,還是按照 Oracle 的規則來走吧,點下 Proceed to Checkout 後,會需要填一些資料,填完之後,點選 Get Content ,如下圖。

AgreementAgreement

接下來到 Docker Profile 的 My Content 就可以找到 Oracle 的內容。

Added_to_my_contentAdded_to_my_content

點選 Setup ,就可以看到 Oracle 映像檔案的使用方式。

click_setupclick_setup

點選 Setup 後就可以看到 Oracle 映像檔案的使用方式了。

啟用 Oracle 容器

因為這是 Docker Store 的容器,所以並不是公開的,所以 pull 之前要先執行 docker login 指令登入 Docker hub 後,再執行 Oracle 的容器。

接下來呢,請執行下方 Oracle 執行容器的指令

bash
  • bash
1
docker run -d -it --name oracle -P store/oracle/database-enterprise:12.2.0.1

  • 參數 -P 是說把所有有公開的連接埠發佈到隨機的連接埠(P一定要大寫)。 根據 Oracle 的文件會把連接埠 1521 與 5500 釋出

    The database server exposes port 1521 for Oracle client connections over SQLNet protocol and port 5500 for Oracle XML DB. SQLPlus or any JDBC client can be used to connect to the database server from outside the container.

    docker-oracle

當 Oracle 容器執行起來後,就要來看一下哪些隨機的連接埠被使用了,我們要使用這連接埠連到 Oracle ,請輸入 docker port oracle 指令取得連接埠對應資訊。 我的範例是 1521/tcp -> 32769, 5500/tcp -> 32768。

docker_oracle_portdocker_oracle_port

有了連接埠後,就可以連到 Oracle 服務了,而根據 Oracle 的文件預設的帳號密碼是 sys/Oradoc_db1 ,預設 SID 是 ORCLCDB。 根據預設的帳號密碼,我這邊使用 SQL Developer 連線到資料庫。 這邊在建立連線的時候記得 Role 要選擇 SYSDBA,否則無法連線。

add_connection in SQL Developeradd_connection in SQL Developer

如上圖說明,當我資料輸入完之後,測試連線,狀態成功!!!

新增使用者

我在測試的時候,sys 的在建立 table 時候會失敗,所以我採用新增使用者的方式來處理這個問題。 用以下的方式建立完角色後,在使用工具登入時候,記得角色要選擇 default 才可以登入。

create an user
  • sql
1
2
3
4
ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE;
CREATE USER miles IDENTIFIED BY 123456;
GRANT CONNECT, RESOURCE, DBA TO miles;
ALTER SESSION SET "_ORACLE_SCRIPT"=FALSE;

我這邊密碼範例使用 123456 ,我在測試的時候,如果密碼有特殊字元如 #$ 之類的都會出錯,所以建議可以使用 英文字+數字 就好。

EF 連線字串範例

把伺服器架起來後,更換連線字串也花了我一點時間,在這邊筆記一下。

connection string
  • config
1
<add name="myEntities" connectionString="DATA SOURCE=localhost:32769/ORCLCDB.localdomain;PASSWORD=xxxx;PERSIST SECURITY INFO=false;USER ID=yyyy" providerName="Oracle.ManagedDataAccess.Client" />

延伸閱讀

[Docker Store Program and Policies]
[Docker Hub - Oracle Database Enterprise Edition]
[SQL Developer Data Pump Import - Video 2 of 3]