DockerでOracle Databaseを構築

# 概要
実務でOracle Databaseを触る機会が多いので、検証用DBをDocker上に構築します。


# 対象読者
・DockerでOracle Databaseを構築したい方

# 配置図
```plantuml
@startuml
title:配置図
node Windows10{
node Docker {
  database OracleDB{
  card "ログイン情報 \n サービス名:FREE \n User:sysytem \n PASS:pass  \n port=11521"
  card "sqlplus \n Oracle DatabaseのCLI"
  port p1  as"port=11521"
  }  
}

node vscode{
 card "IDE"
}

node A5SQL{
card "SQLのGUIクライアント"


}
}
A5SQL --> p1 :直接接続（Oracle Client不要）


}

  


@enduml



```



# 環境
名称|バージョン|説明
---|----|------
Windows|10|クライアントのOS
Docker|--|コンテナ型仮想環境
Oracle|Database 23ai Free Release 23.0.0.0.0|データベース
A5:SQL|2.20.1|SQLのGUIクライアント

# 手順

## ダウンロード

以下ページのリポジトリをダウンロードします。
dockerイメージを作成するために使います。
https://github.com/oracle/docker-images

## Docker イメージ作成
ダウンロードしたフォルダに以下ファイルがあることを確認します。
OracleDatabase/SingleInstance/dockerfiles/buildContainerImage.sh

自分は、23.3.5を選択しました。(オプションで指定します。)
実行完了するまでに5,10分かかります
```bash 
# bash or wslで実行する
ls
>OracleDatabase/SingleInstance/dockerfiles

./buildContainerImage.sh -v 23.3.5 -f
```


イメージが作成されていることをCLIで確認
```powershell
docker image ls 
REPOSITORY
                TAG           IMAGE ID       CREATED         SIZE        
oracle/database
                23.5.0-free   b3e9ab706c34   9 hours ago     4.95GB

```


docker desktopで確認した図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/9ecfe857-fc1b-d303-1c13-b4bab3d2efc6.png)


## docker-compose.yml 作成
```yml:docker-compose.yml
services:
  oracle_db:
   image: oracle/database:23.5.0-free
   container_name: oracle_test_db
   shm_size: 1g # 共有メモリを1GB以上にしないとコンテナ起動時にエラーが発生します。
   environment:
     - TZ=Asia/Tokyo
     - LANGUAGE=ja_JP.ja
     - LANG=ja_JP.UTF-8
     - NLS_LANG=Japanese_Japan.AL32UTF8 # sqlplusの日本語化でこの環境変数が必要になります。
     - ORACLE_PWD=pass # パスワードは適宜指定します。
   ports:
     - 11521:1521
   volumes:
     - ./src:/opt/oracle/oradata
```

・データ部分はバインドマウントを使って永続化しています。
　docker-compose.ymlと同じ階層に「src」フォルダを作成します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/e43e0350-75c7-daa6-f8d5-5b53dde1d648.png)




## dockerコンテナ起動
```powershell
docker-compose up -d
```


初回起動時は、データベースを構築する時間がかかります。
自分の環境では７分ほどかかりました。

構築開始時のログ(Docker for Desktop)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/3419573d-39ce-fad3-e73b-4cc074972e5f.png)


構築終了時のログ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/fdfc5556-5833-4e28-268c-69c76974aea2.png)

## コンテナ内のsqlplusからSQLを実行する
```bash
## sqlplusに入る
docker-compose exec -it  oracle_db bash -c "sqlplus system/pass"

## 
SQL> SELECT * FROM v$version;

## 結果
中略
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
```



## A5:SQLで接続する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/4aba7174-3ccb-9637-90e4-0f5b7a1ea5cc.png)







### サービス名についての調べ方

```bash
# Docker コンテナ内に入る
docker-compose exec -it  oracle_db bash
# Docker コンテナ内で実行
echo "show parameter service;" | sqlplus system/pass
# 結果　サービス名はFREEになる
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
auto_start_pdb_services              boolean     FALSE
service_names                        string      FREE
statement_redirect_service           string
SQL> Oracle Database 23ai Free Release 23.0.
```

## 感想
以下の２点で手間どりましたね
・Docker Imageのビルド方法
・ログイン情報（サービス名が特に）

## 参考

github差分
https://github.com/RYA234/External_Collaboration/commit/61bcb4b0ebb5621399e4b3541c3f653458a78bdb

初期のログイン情報について sys と　systemがデフォルト
https://www.prgkop.com/oracle-sys-system-login/

イメージの準備方法を参考
https://qiita.com/h-i-ist/items/a67acbce0e7c6bdebd69

docker-compose　A5SQLの設定など　書き方を参考
https://qiita.com/hrk_okd/items/f098ee234b702975c4fd