#本投稿の背景
自宅PC(Windows Home環境)でDockerを触ってみようというのと、
さらにOracle Databaseも簡単に環境セットアップしたいなと思ったのが背景です。
#本投稿で実施する内容
1.Windows10 Home(64bit)環境にDocker Desktopをインストール
2.Docker HubからOracle Database Enterprise EditionのイメージをPull
3.Pullしたイメージを使用してコンテナを起動
#1.Windows10 Home環境にDocker Desktopをインストール
##Docker Desktopをインストール
https://www.docker.com/products/docker-desktop
ダウンロードした、Docker Desktop Installer.exe を実行
2つのチェックはそのままで、[OK]をクリック
インストールが終わったら、OSを再起動
OS再起動すると Dockerが起動します。
※OS起動時にDocker起動しないようにするには、DockerDesktopの[Setting]-[General]で
[Start Docker Desktop when you log in]のチェックを外します

起動時に「An error occurred」とエラーがでる
上記リンク
https://docs.docker.com/docker-for-windows/troubleshoot/#virtualization
を確認。
私の環境は、
・[Windowsの機能の有効化または無効化]で
「Linux用Windowsサブシステム」、「仮想マシンプラットフォーム」にチェックが入っている。
・仮想化機能を有効にするためのBIOS設定は[有効]。
・[Hyper-V]がOFFになっていました ★
→こちらの記事 Hyper-VのON・OFFを簡単に自動化すっぞ!! を参考に
Hyper-VをONにしたところ、「An error occurred」のエラーはでませんでした。
再度、Docker Desktopを起動(デスクトップにある、Docker Desktopで起動)
メッセージにある、https://aka.ms/wsl2kernel の[x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ]をクリックすると、wsl_update_x64.msi がダウンロードされますので、
ダウンロードが完了したら、こちらを実行します。
Docker Desktopの画面が起動するので、[Skip tutorial]をクリック
##Docker Desktopでサンプルコンテナを起動
###Dockerのバージョン確認
※Dockerがインストールされているかの確認
docker version
###イメージの確認
docker images
###コンテナ稼働状態の確認
http://docs.docker.jp/v17.06/engine/reference/commandline/ps.html
docker ps -a
###サンプルのコンテナを起動
getting-startedのイメージを使用して、コンテナ名はtutorial、コンテナのポート80は、ホストマシンのポート80に割り当てコンテナを起動。
docker run -d --name tutorial -p 80:80 docker/getting-started
###コンテナ稼働状態の確認
docker ps -a
runコマンドでしていしたtutorial という名前のコンテナが起動している。(STATUS が UP になっている)
###イメージの確認
docker images
runコマンドで指定した、getting-startedのImageがある
###コンテナを停止、状態確認
docker stop <コンテナ名>
docker ps -a
###コンテナを削除
docker rm <コンテナ名>
docker ps -a
###イメージを削除、確認
docker rmi <イメージ名>
docker images
イメージ削除後、docker images で確認してイメージが削除されたことを確認。
#2.Docker HubからOracle DatabaseイメージをPull
##Dockerイメージの入手方法
イメージの入手方法は2つあり、「ビルド済のイメージを使用する方法」と「ビルド用のイメージを入手して自分でビルドする方法」があります。
1.ビルド済のイメージを使用する方法
・Oracle Container Registry(https://container-registry.oracle.com)
・Docker Hub(https://store.docker.com)
2.ビルド用のイメージを入手して自分でビルドする方法
・Github(https://github.com/oracle/docker-images)
本投稿では、少ない手順でOracle Databaseのコンテナを使用したいので「ビルド済のイメージを使用する方法」を選択します。
Oracle Container Registryのイメージは、
「商用ライセンスまたはオラクル・トライアル・ライセンス契約」となっており、今回は個人で使用するのですが、トライアルライセンスの場合、「トライアル期間」は、 このトライアル・ライセンスの諸条件を受諾した日から30日となります。
※ライセンスについての詳細はOracle Container Registryにログインして内容を確認ください
Docker Hubのイメージは、
OTNライセンスとなっており、今回は学習用として使用しますのでDocker Hubのイメージを使用します。
※ライセンスについての詳細はDocker Hubにログインして内容を確認ください
本投稿では、Docker Hubのビルド済のイメージを使用します
##Docker Hubを利用するためアカウント作成
Docker HubにあるOracle Databaseのイメージを使用するため、Docker Hubが利用できるようにアカウントを作成します。
###Docker Hubにアクセスして、アカウント作成
https://hub.docker.com/
登録したemailにメールが届く
[Verify email address]をクリック
Docker ID、パスワードでSign In
###Oracle Database Enterprise Editon のイメージを検索
利用規約を確認して[Proceed Checkout]をクリック
##Oracle Database Enterprise Editon のイメージをPull
###Power Shellを起動して、Docker Hubにログイン
docker login
###Oracle Database Enterprise Edition のイメージをPull
docker pull store/oracle/database-enterprise:12.2.0.1
docker images
docker images で イメージがPullされていることを確認
#3.PullしたOracle Database Enterprise Editionのイメージを使用してコンテナを起動
##docker runコマンドでコンテナを起動
docker run -d -it --name orcl -p 1521:1521 -v C:\app\oradata:/ORCL store/oracle/database-enterprise:12.2.0.1
コンテナ名をorcl、1521ポートをホストマシンのポート1521に割り当て、oracleで使用するファイル群をホストマシンの c:\app\oradata に作成して、コンテナを起動しています。
-v オプションを指定しない場合、oracle で使用するファイル群は コンテナ内に作成されます。
コンテナを削除するとファイルも削除されてしまうため、それを回避する場合、-v オプションを指定してファイルを外部に作成します。
※上記のdocker run のパラメータは、Docker HubのOracle Database Enterprise Edition のものとなります。Oracle Container Registry や Github のイメージをビルドする場合、
ドキュメントを確認ください(それぞれ、若干パラメータが違います)
DB作成に少し時間がかかります。作成状況を確認する場合、docker logs で状況を確認します。
docker logs <コンテナ名>
「Done ! The database is ready for use .」と出ればDBは使える状態になっています。
##作成されたコンテナを確認
docker ps -a
設定されている設定項目
設定項目 | 設定値 |
---|---|
DB_SID | ORCLCDB |
DB_PDB | ORCLPDB1 |
DB_MEMORY | 2GB(sga_target:1280M、pga_aggregate_target:768M |
DB_DOMAIN | localdomain |
sysのパスワード | Oradoc_db1 |
##ホストマシンからsqlplusでDBに接続
コンテナの1521ポートがホストの1521ポートに割り当てられているので、1521ポートを指定してDB接続。
C:\> sqlplus sys/Oradoc_db1@localhost:1521/ORCLCDB.localdomain as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 21:57:22 2021
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Last Successful login time: Sun Jan 24 2021 21:51:11 +09:00
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL>
SQL>
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL>
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB1 READ WRITE NO
SQL>
##コンテナに接続
docker exec でコンテナに接続して、DBにローカル接続。
docker exec -it orcl bash
[oracle@6dddfb8fbe94 /]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 13:02:29 2021
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB1 READ WRITE NO
SQL>
##コンテナを停止
docker stop <コンテナ名>
docker ps -a
コンテナ停止の際、DBのアラートログを見ると、DBをshutdown immediate でDBをシャットダウンしていました。
##[検証その1] テーブルを作成して、コンテナ停止→起動でテーブルが残っているか確認
pdbに接続して、scottユーザを作成し、テーブル[test]を作成。
C:\> sqlplus sys/Oradoc_db1@localhost:1521/ORCLCDB.localdomain as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 13:02:29 2021
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB1 READ WRITE NO
SQL>
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB1 READ WRITE NO
SQL> alter session set container="ORCLPDB1";
Session altered.
SQL> create user scott identified by Welcome1!;
create user scott identified by Welcome1!
SQL>exit
C:\>sqlplus scott/Welcome1!@localhost:1521/ORCLPDB1.localdomain
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 22:23:58 2021
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL>
SQL> create table test(col1 number);
Table created.
SQL> desc test
Name Null? Type
----------------------------------------- -------- ----------------------------
COL1 NUMBER
SQL>
この状態でコンテナ停止→起動
docker stop <コンテナ名>
docker start <コンテナ名>
コンテナ起動後、sqlplus で接続してテーブル確認
C:\>sqlplus scott/Welcome1!@localhost:1521/ORCLPDB1.localdomain
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 22:32:00 2021
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Last Successful login time: Sun Jan 24 2021 22:23:59 +09:00
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> desc test
Name Null? Type
----------------------------------------- -------- ----------------------------
COL1 NUMBER
→結果は、テーブルは残っていることを確認
##[検証その2] コンテナを削除→docker run(Oracleのファイル群は -v オプションで使用したディレクトリを指定して再利用)でテーブルが残っているか確認
コマンドは以下を実行。
コンテナ停止、コンテナ削除、コンテナ起動。DB作成が完了したかは docker logs で確認。
docker stop <コンテナ名>
docker ps -a
docker rm <コンテナ名>
docker run -d -it --name orcl -p 1521:1521 -v C:\app\oradata:/ORCL store/oracle/database-enterprise:12.2.0.1
docker ps -a
docker logs <コンテナ名>
docker logs で「Done ! The database is ready for use .」が出力されたのを確認後、
sqlplus で接続して確認。
C:\>sqlplus scott/Welcome1!@localhost:1521/ORCLPDB1.localdomain
SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 23:11:54 2021
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Last Successful login time: Sun Jan 24 2021 22:32:00 +09:00
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> desc test
Name Null? Type
----------------------------------------- -------- ----------------------------
COL1 NUMBER
SQL>
結果は、
コンテナ削除する前に作成したテーブルがあることを確認。
-v オプションで指定したディレクトリのデータファイル群があれば、コンテナ削除しても、別ホストでコンテナ起動しても、DBのデータは引き継ぐことができることが確認できました。