Windows10 Home環境にDocker DesktopをインストールしてOracle Databaseのイメージを動かす

#本投稿の背景
自宅PC(Windows Home環境)でDockerを触ってみようというのと、
さらにOracle Databaseも簡単に環境セットアップしたいなと思ったのが背景です。
#本投稿で実施する内容

１．Windows10 Home(64bit)環境にDocker Desktopをインストール
２．Docker HubからOracle Database Enterprise EditionのイメージをPull　　
３．Pullしたイメージを使用してコンテナを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/87d8ca7b-829a-2cd1-b84b-d90a1e4fa6cf.png)


#１．Windows10 Home環境にDocker Desktopをインストール

##Docker Desktopをインストール
https://www.docker.com/products/docker-desktop
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/808ed9d8-df09-2e6f-5914-de3cd34ba369.png" width=80%>

ダウンロードした、Docker Desktop Installer.exe を実行
２つのチェックはそのままで、[OK]をクリック
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/9a06aa1f-2af9-2440-be2f-b5919477ceb5.png" width=80%>
インストールが終わったら、OSを再起動
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/d37ee1be-6146-2d8d-c9e6-7aaaaa214b18.png" width=80%>

OS再起動すると Dockerが起動します。
※OS起動時にDocker起動しないようにするには、DockerDesktopの[Setting]-[General]で
　[Start Docker Desktop when you log in]のチェックを外します

  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/bf592d3f-5a64-c8de-e3ce-f55a2dc740f0.png" width=80%>

起動時に「An error occurred」とエラーがでる
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/a45a02d9-ecb9-6ffd-64dc-b853b82982eb.png" width=80%>

上記リンク
https://docs.docker.com/docker-for-windows/troubleshoot/#virtualization　
を確認。

私の環境は、
・[Windowsの機能の有効化または無効化]で
「Linux用Windowsサブシステム」、「仮想マシンプラットフォーム」にチェックが入っている。
・仮想化機能を有効にするためのBIOS設定は[有効]。
・[Hyper-V]がOFFになっていました ★
　　→こちらの記事　[Hyper-VのON・OFFを簡単に自動化すっぞ！！](https://qiita.com/dodonki1223/items/75bd5171e2f2193c9977)　を参考に
　　　Hyper-VをONにしたところ、「An error occurred」のエラーはでませんでした。
　　　
再度、Docker Desktopを起動(デスクトップにある、Docker Desktopで起動)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/32497f6a-58db-eec5-068d-edbd804d62f6.png)

再びメッセージが出力されます
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/12523c45-8b4e-3d3d-2744-e04f8f303bc2.png" width=80%>

メッセージにある、https://aka.ms/wsl2kernel の[x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ]をクリックすると、wsl_update_x64.msi　がダウンロードされますので、
ダウンロードが完了したら、こちらを実行します。

[Next]をクリック
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/b67c5dd1-4ab5-01bc-7982-277359433227.png" width=80%>
[Finish]をクリック
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/ae610a22-83a4-9896-1ab0-6eee8be9120e.png" width=80%>

[Restart]をクリック
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/12523c45-8b4e-3d3d-2744-e04f8f303bc2.png" width=80%>

Docker Desktopの画面が起動するので、[Skip tutorial]をクリック
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/b6562445-417a-a093-420e-215c1a5e85a3.png" width=80%>

コンテナがなにも起動していない状態と表示されている
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/eb5e139d-6ab4-141b-6835-75449c6a1c09.png" width=80%>

##Docker Desktopでサンプルコンテナを起動

Power Shellを起動
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/ac207689-4bec-e589-9c77-df98600ecb04.png" width=80%>

###Dockerのバージョン確認
※Dockerがインストールされているかの確認

```powershell 
docker version
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/a66b3be1-e0ae-db33-e66e-81c30b1b3e77.png)

###イメージの確認

```powershell
docker images
```
イメージはない状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/48e18585-d348-0cb6-5c02-9ded79a92a62.png)

###コンテナ稼働状態の確認
http://docs.docker.jp/v17.06/engine/reference/commandline/ps.html

```powershell
docker ps -a
```
コンテナはまだ作成されていない状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/2d2094d6-6c36-5a72-03ef-38797a301561.png)

###サンプルのコンテナを起動
getting-startedのイメージを使用して、コンテナ名はtutorial、コンテナのポート80は、ホストマシンのポート80に割り当てコンテナを起動。

```powershell
docker run -d --name tutorial -p 80:80 docker/getting-started 
```

###コンテナ稼働状態の確認

```powershell
docker ps -a
```
runコマンドでしていしたtutorial という名前のコンテナが起動している。(STATUS が UP になっている)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/2c06ceb1-f125-518f-ba2b-bdbdbcb97f37.png)


###ブラウザで localhost と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/c8d48671-34d7-6069-82fc-b915ad124b1f.png)

Getting Started　のページが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/3ecb3f85-e7bd-6d1d-da6c-2963a5754c98.png)


###イメージの確認

```powershell
docker images
```
runコマンドで指定した、getting-startedのImageがある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/e26e759c-be70-4a97-2ba7-1077c251a18f.png)

###コンテナを停止、状態確認

```powershell
docker stop <コンテナ名>
docker ps -a
```
STATUSがExitになり、コンテナが停止。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/355ae337-bc21-2701-a83e-6c6009f452a3.png)

###コンテナを削除

```powershell
docker rm <コンテナ名>
docker ps -a
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/d4f32cc2-34b4-8c7b-a405-e13237f5e46e.png)


###イメージを削除、確認

```powershell
docker rmi <イメージ名>
docker images
```
イメージ削除後、docker images で確認してイメージが削除されたことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/2fb8844f-c101-f5ea-ecf5-d98f4cd8e1e5.png)

#２．Docker HubからOracle DatabaseイメージをPull

##Dockerイメージの入手方法

イメージの入手方法は２つあり、「ビルド済のイメージを使用する方法」と「ビルド用のイメージを入手して自分でビルドする方法」があります。

**１．ビルド済のイメージを使用する方法**
　・Oracle Container Registry(https://container-registry.oracle.com)
　・Docker Hub(https://store.docker.com)
**２．ビルド用のイメージを入手して自分でビルドする方法**
　 ・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/
　 
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/691ad51c-04d2-7c2d-716f-a7da5e27bead.png" width=80%>
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/db50d46a-ef57-a4b2-043b-4b24cf487744.png" width=80%>

登録したemailにメールが届く
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/ccfc4bc3-d0d3-cec5-4c42-800367d42f79.png" width=80%>
[Verify email address]をクリック
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/5d28c779-a063-d9dc-58c5-ccd6cfcf7775.png" width=60%>
Docker ID、パスワードでSign In
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/2f7cfd01-5942-9e28-d42d-78bba1ee99cc.png" width=60%>

###Oracle Database Enterprise Editon のイメージを検索
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/bca7a6df-0c81-4686-127f-3db054265302.png" width=80%>
利用規約を確認して[Proceed Checkout]をクリック
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/09d7ef4f-52ac-76a7-c29f-56049a7d2c77.png" width=80%>

各種情報を入力して、[Get Content]をクリック
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/f2e77692-b7bb-9903-9e7e-1ab6f5a4b6ac.png" width=80%>
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/05cf6824-c671-0315-dfab-9059978356e4.png" width=80%>

##Oracle Database Enterprise Editon のイメージをPull

###Power Shellを起動して、Docker Hubにログイン

```powershell
docker login
```
Docker IDとパスワードを入力
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/80a4c16c-e053-7944-99b0-c8c53d96b69a.png" width=80%>

###Oracle Database Enterprise Edition のイメージをPull

```powershell
docker pull store/oracle/database-enterprise:12.2.0.1
docker images
```

docker images で イメージがPullされていることを確認
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/5aa94231-57b0-c905-1583-93afc34fc07f.png" width=80%>



#３．PullしたOracle Database Enterprise Editionのイメージを使用してコンテナを起動

##docker runコマンドでコンテナを起動

```powershell
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 で状況を確認します。

```powershell
docker logs <コンテナ名>
```
「Done ! The database is ready for use .」と出ればDBは使える状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/5a99d624-470f-f472-a120-957109ede366.png)

##作成されたコンテナを確認

```powershell
docker ps -a 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/a23fa0df-79b7-132c-366d-5bd1dd9c6504.png)

設定されている設定項目

|設定項目  |設定値  |
|---|---|
|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にローカル接続。


```powershell
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>
```

##コンテナを停止

```powershell
docker stop <コンテナ名>
docker ps -a
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/201e2f61-b363-1329-8740-102f90759385.png)

コンテナ停止の際、DBのアラートログを見ると、DBをshutdown immediate でDBをシャットダウンしていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261475/d85dcd5d-8de2-0150-bdc5-6da8424a15bc.png)

##[検証その１] テーブルを作成して、コンテナ停止→起動でテーブルが残っているか確認

pdbに接続して、scottユーザを作成し、テーブル[test]を作成。

```sql
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>
```

この状態でコンテナ停止→起動

```powershell
docker stop <コンテナ名>
docker start <コンテナ名>
```

コンテナ起動後、sqlplus で接続してテーブル確認

```sql
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

```

→結果は、テーブルは残っていることを確認

##[検証その２] コンテナを削除→docker run(Oracleのファイル群は -v オプションで使用したディレクトリを指定して再利用)でテーブルが残っているか確認

コマンドは以下を実行。
コンテナ停止、コンテナ削除、コンテナ起動。DB作成が完了したかは docker logs で確認。

```powershell
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 で接続して確認。


```sql
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のデータは引き継ぐことができることが確認できました。