DockerでOracle Databaseを構築してみる

## はじめに

Dockerを利用してOracle環境を構築した経験があるため、OracleのDockerイメージをビルドし、SQLPlusを起動するまでのプロセスをまとめてみます。

## 前提条件

- 事前にDockerをインストールしておいてください。
    - https://www.docker.com/products/docker-desktop/

## 1. Dockerファイルの準備

今回はOracleの公式GitHubリポジトリからcloneします。

https://github.com/oracle/docker-images

```tsx
git clone https://github.com/oracle/docker-images.git
```

## 2. Dockerイメージのビルド

23cのバージョンのdocker imageをビルドします。

```tsx
cd OracleDatabase/SingleInstance/dockerfiles
./buildContainerImage.sh -v 23.3.0 -f
```

ビルドが完了するのに時間がかかりますが、以下のメッセージがでたら成功しています。

```tsx
Build completed in 383 seconds.
```

今回は簡単のため23cのバージョンをビルドしていますが、

18c XE, 21c XE and 23c FREE以外のバージョンだとOracleの公式サイトからLinux x86-64 のバイナリデータをダウンロードしてdockerfiles直下のフォルダに配置する必要があります。

https://www.oracle.com/database/technologies/oracle-database-software-downloads.html

詳細はREADMEをご覧ください。

https://github.com/oracle/docker-images/tree/main/OracleDatabase/SingleInstance

## 3. Dockerイメージの確認

ビルドが完了したら、次のコマンドを実行してイメージが正しく作成されたことを確認します。

```tsx
dockerfiles % docker images
REPOSITORY        TAG               IMAGE ID       CREATED          SIZE
oracle/database   23.3.0-free       2ddf79c13a25   44 minutes ago   5.28GB
```

## 4. コンテナの起動

次のコマンドを使用してOracle Databaseのコンテナを起動します。

```tsx
dockerfiles % docker run -d --name oracle-db　-e ORACLE_PWD=password oracle/database:23.3.0-free
```

- `docker run`: Dockerコンテナを新しく作成して実行するためのコマンドです。
- `-d`: デタッチモードでコンテナを実行します。つまり、コンテナがバックグラウンドで実行され、コマンドラインから即時に制御が戻ります。
- `--name oracle-db`:このオプションを使用して、作成されるコンテナに`oracle-db`という名前を割り当てます。これにより、将来的にこのコンテナを参照したり操作したりする際に、コンテナIDの代わりにこの名前を使用できます。
- `-e ORACLE_PWD=password`: 環境変数`ORACLE_PWD`に`password`を設定します。この環境変数は、データベースのSYS、SYSTEM、およびPDBの管理ユーザーのパスワードを設定するために使用されます。ここでの`password`は、実際に使用する強力なパスワードに置き換えるべきです。
- `oracle/database:23.3.0-free`: コンテナのイメージを指定します。ここでは先ほど作成した`oracle/database`というイメージの`23.3.0-free`というタグを使用しています。

## 5. コンテナ確認

次のコマンドを使用してコンテナが起動しているか確認します。

```tsx
dockerfiles % docker ps 
```

起動していると`STATUS`が`UP`になっています。

```tsx
CONTAINER ID   IMAGE                         COMMAND                   CREATED      STATUS                PORTS      NAMES
e078c7a5b2a7   oracle/database:23.3.0-free   "/bin/bash -c $ORACL…"   2 days ago   Up 2 days (healthy)   1521/tcp   oracle-db
```

## 6. SQLPlus起動

まず、起動したコンテナに入ります。

```tsx
dockerfiles % docker exec -it oracle-db bash
```

- `docker exec`: 実行中のコンテナ内で任意のコマンドを実行するためのコマンドです。
- `it`: このオプションは二つのフラグを組み合わせたものです。`i`（または`-interactive`）は、対話的な操作を可能にします。`t`（または`-tty`）は、コンテナ内で対話式シェルを使用することができるようになります。
- `oracle-db`: 実行するコンテナの名前です。この場合、`oracle-db`は以前に`docker run`コマンドで`-name`オプションを使用して名前付けされたコンテナの名前です。
- `bash`: コンテナ内で実行されるコマンドです。この例では、`bash`シェルを開始します。これにより、ユーザーはコンテナのbash環境で対話的にコマンドを実行できるようになります。

コンテナ内で以下のコマンドでSQLPlusを起動します。

```tsx
bash-4.4$ sqlplus system/password@//localhost:1521/FREEPDB1
```

- `sqlplus`: Oracle SQL*Plusツールを起動するコマンドです。
- `system/password`: データベースに接続するためのユーザー名とパスワードです。ここで`system`はユーザー名を、`password`はそのユーザーのパスワードを指します。`system`はOracle Databaseのデフォルトの管理ユーザーの一つであり、データベース管理に広範な権限を持っています。`password`は接続時に必要な実際のパスワードに置き換えてください。
- `@//localhost:1521/FREEPDB1`: 接続文字列で、データベースへの接続情報を提供します。
    - `localhost`: この場合、データベースがローカルマシン上で実行されていることを意味します。リモートデータベースに接続する場合は、`localhost`をデータベースサーバーのホスト名またはIPアドレスに置き換えます。
    - `1521`: Oracle Databaseがリッスンしているポート番号です。1521はOracleのデフォルトのポート番号です。
    - `FREEPDB1`: データベースのサービス名です。Oracle Database 12c以降では、マルチテナントアーキテクチャを採用しており、このサービス名はプラグ可能なデータベース（PDB）を指します。`FREEPDB1`は具体的なPDBの名前であり、実際に接続したいPDBの名前に置き換える必要があります。
    
    以下のようなコマンドが出てきたら起動成功です。
    
    ```tsx
    Connected to:
    Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
    Version 23.3.0.23.09
    ```
    
    ## 7. コンテナの停止、削除
    
    不要になったコンテナは以下のコマンドで停止、削除を行ってください。
    
    ```tsx
    docker stop oracle-db
    docker rm oracld-db
    ```
    
    `docker stop`: このコマンドは、実行中のDockerコンテナを停止するために使用されます。
    
    `docker rm`: このコマンドは、停止されている（または実行中でない）Dockerコンテナを削除するために使用されます。
    
    `oracle-db`: 停止、削除するコンテナの名前を指定します。
    
    ## まとめ
    
    この記事では、Dockerを使用してOracle Databaseを構築する方法を紹介しました。
    
    Oracle Databaseの試用や学習が気軽に行えるため、ぜひ試してみてください。