WindowsのdockerでOracle 11gの開発環境を作成する

今さらながら仕事でOracle 11gを使うことになっています。

Oracle自体は、2012年～2013年くらいに触ったことがあって、初めて使用したデータベースがOracleでした。
なので、僕の中ではデファクトスタンダード・・・とはならず、インストールやら文字コードやら、接続文字列やらで苦労した経験しかありません。

とはいうものの、仕事で使用することになったので避けるわけにもいきません。
それに加え、個人用の開発環境を簡単に構築できる方法を模索していたところ、docker使ってみればいいのではと思いつきました。

そう思って調べたところ、以下の記事が見つかったので、こちらに則って（というかパクってｗ）作業をしつつ、個別の補足を追加していきます。

https://qiita.com/moriwakiii/items/e885407dc1dc018d4950


# 事前準備
参考元の記事の通りですが、事前に必要なものは以下の通りです。

- gitインストール済み
- dockerインストール済み（Docker for Windows または Docker Toolbox)
- Oracle.comのアカウント作成済み

なお、参考元記事はMacですが、僕の場合はWindows 10 Home Editionになります。


# 環境作成方法

実際の環境作成ですが、以下の手順で実行します。

- githubからOracleをダウンロードする
- Oracle 11gのバイナリをダウンロードする
- dockerイメージをビルドする
- dockerコンテナを起動する


## githubからOracleをダウンロードする
任意のフォルダ（以降、イメージフォルダ）で、以下のコマンドを実行します。

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

## Oracle 11gのバイナリをダウンロードする
以下のサイトからOracle 11gのバイナリをダウンロードします。
https://www.oracle.com/technetwork/jp/database/database-technologies/express-edition/downloads/xe-prior-releases-5172097-ja.html

用するのは、3つ目の「Oracle Database Express Edition 11g Release 2 for Linux 64」になるので間違わないように注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258092/e4c51e1b-920b-6a88-a6ac-26dd5719f09f.png)

ダウンロードしたバイナリは、以下に配置してください。

```shell
イメージフォルダ/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2
```

## dockerイメージをビルドする

```shell
$ cd イメージフォルダ/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles
$ ./buildDockerImage.sh -v 11.2.0.2 -x -i
```

パソコンのスペックにもよると思いますが、3～5分ほどでイメージが作成されます。

```
Oracle Database Docker Image for 'xe' version 11.2.0.2 is ready to be extended:
--> oracle/database:11.2.0.2-xe Build completed in 258 seconds.
```

## DockerFileとdocker-compose.ymlの作成
任意のフォルダにDockerFileとdocker-compose.ymlを作成します。
設定内容は下記参照。

https://qiita.com/wakaken/items/fd870719fda966ab1a79

```dockerfile:DockerFile

# イメージを指定します
FROM oracle/database:11.2.0.2-xe 

RUN yum -y install vi
RUN echo 'TZ="Asia/Tokyo"' > /etc/sysconfig/clock
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN echo 'LANG="ja_JP.UTF-8"' > /etc/sysconfig/i18n
RUN echo 'LC_CTYPE="ja_JP.utf8"' >> /etc/sysconfig/i18n
RUN yum reinstall -y glibc-common
RUN yum reinstall -y glibc
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8

# ポート番号1521で起動
EXPOSE 1521
```

```yml:docker-compose.yml
version: "2.0"

services:
  database:
   build:
     context: .
     dockerfile: Dockerfile
   container_name: oracle11
   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=oracle11 # sys,systemのパスワード
     - ORACLE_SID=XE
     - ORACLE_PDB=pdb1     
   ports:
     - 1521:1521
   volumes:
     - ./oradata:/opt/oracle/oradata # データの永続化
```

## dockerコンテナを起動する
DockerFileとdocker-compose.ymlを作成したフォルダに移動し、コンテナを起動します。

```shell
$ cd DockerFileのフォルダ
$ docker-compose up -d
```

# データベースへの接続
起動したdockerコンテナのデータベースへの接続方法を説明します。

## SQL Plusで接続する
dockerで起動しているOracleのコンテナIDを取得します。

```shell
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe7a257fe2fc oracle/database:11.2.0.2-xe "/bin/sh -c 'exec $O…" 14 minutes ago Up 14 minutes (healthy) 0.0.0.0:1521->1521/tcp oracle11
```

コンテナIDを指定してbashを起動します。

```shell
$ docker exec -it fe7a /bin/bash
bash-4.2# sqlplus system/oracle11@//localhost:1521/XE
SQL*Plus: Release 11.2.0.2.0 Production on Wed May 6 10:29:30 2020
Copyright (c) 1982, 2011, Oracle. All rights reserved.

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL>
```

コンテナ内にて、sqlplus経由で接続することができました。

## クライアントPCからdockerに接続
dcokerを起動しているWindowsのPCから、a5m2を使用してdockerコンテナ内のDBに接続しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258092/9c827633-0336-eb5f-a36d-90187d01dd7f.png)

今回使用した環境はWindows 10 Home Editionなので、Docker Toolboxを使用しています。
そのため、ホスト名はVirtual BoxのIPアドレスを指定しないといけません。
実は僕はここにかなり詰まっていたのですが、こちらのページを見つけて解決できました。
https://www.it-swarm.dev/ja/windows/docker-toolbox%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%9B%E3%82%B9%E3%83%88%E3%81%8C%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%AA%E3%81%84/831640913/

Docker for Windowsや他の環境では別のホスト名になると思いますので、別途確認して設定しましょう。

なお、コンテナを削除（docker rm コンテナ名）を実行すると、作成したデータも消失するので気をつけましょう。
PCの再起動は実施しても問題ありません。

# 最後に：Oracleもdockerで共有して開発を効率化しよう
WindowsのDockerでOracleデータベースを使用することが確認できました。

DBの環境構築は何かとトラブルがつきものです。
僕の勝手なイメージですが、その中でも特にOracleはトラブルが多いDBだと認識しています。

でも、dockerで環境構築したイメージを共有すれば、環境構築でのトラブルは大きく回避することができます。
Oracleの環境構築の手順は必要なく、イメージの使い方を学んでいけば事足ります。

運用はしっかり考えなくてはいけませんが、DBでdockerを使用するのは実に理に適っているので、使えるところは積極的に使っていきたいですね。