今回のプロジェクトはソフトウェアを直接パソコンにインストールするので、なんだかんだで開発環境の構築に1日以上かかりました。リリースは来年なので、ここから結合テスト以降のテストを行うそうです。

今回はDocker化しておけば楽だよねと余計なお世話をした結果、詰んだお話です。

本番環境ではWindows Serverを利用するのでソフトウェアは以下の通りです。

・Windows Server
・Oracle Database
・Java
・tomcat

Dockerで以下のような構成のOracle DatabaseとWindows Serverのコンテナを用意することにします。

Delivery
|- Delivery_db    ・・・ データベース用コンテナ(Oracle19c)
|- Delivery_web   ・・・ WEBサーバー用コンテナ(WindowsServer、tomcat、java、webアプリ)

Oracle Databaseコンテナの作成

まずはOracleのコンテナを作ってみます。ググるとgithubでイメージを作成するプログラムが公開されていましたので、今回はそちらを利用させてもらいます。以下のリポジトリからイメージを作成するプログラムをクローンします。

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

クローンした中身をみるとOracle製品に関する様々なイメージを作成できるようで、その中でDatabaseのイメージを作成する以下のディレクトリを利用します。

docker-images/OracleDatabase/SingleInstance/dockerfiles

とここでイメージ作成にはOracle Databaseのインストールファイルが必要になりますので、先にOracleのサイトからインストールファイルをダウンロードします。

今回はバージョン19cを使います。イメージ作成プログラムはOracle Linux8で動くイメージを作成するのでLinux版を選択。使用する自機がM1 Macbookなのでaarch64用のzip形式をダウンロードします。

ダウンロードしたインストールファイルは先程のディレクト下のバージョンごとのディレクトリに格納します。ダウンロードしたインストールファイルのバージョンは19.19.0なので該当のディレクトリはありませんがメジャーバージョンがあっていればいいようなので以下の19.3.0に格納します。

docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0

格納したら以下のコマンドでイメージを作成します。イメージの作成には数分かかりますのでゆっくり待つます。またコマンドの引数の詳しい説明は1階層上のSingleInstanceにあるREADME.mdで確認します。

$ cd docker-images/OracleDatabase/SingleInstance/dockerfiles
$ ./buildContainerImage.sh -v 19.3.0 -e -i

コマンドが終了するとイメージが作成されていますので確認します。

$ docker image ls
REPOSITORY         TAG         IMAGE ID       CREATED          SIZE
oracle/database    19.3.0-ee   115604b484ae   30 seconds ago   5.52GB

ここでdockerコマンドで起動できれば終わりですが、Windows Serverのコンテナも作らなければいけないので、docker-compose.ymlを作り、Oracle databaseとWindows Serverのコンテナをまとめることにします。

【docker-compose.yml】
services:
  db:
    container_name: delivery_db
    build:
      context: .containers/db
      dockerfile: Dockerfile
    ports:
      - 1521:1521
      - 5500:5500
    volumes:
      - .containers/db:/docker-entrypoint-initdb.d
      - ordata:/opt/oracle/ordata
    environment:
      - ORACLE_PWD=password
      - ORACLE_SID=orcl
      - ORACLE_PDB=orclpdb

volumes:
    ordata:

また各種設定を記載するためにデータベースコンテナ用のDockerfileも用意します。

【Dockerfile】
FROM oracle/database:19.3.0-ee

後ほどOracle Databaseの接続ユーザーなどを記載する予定ですがDockerfilesの中身はとりあえずイメージ名だけ記載します。

ここまでできたらOracle Databaseのコンテナをビルドして起動します。

$ docker-compose -f docker-compose.yml build
$ docker-compose -f docker-compose.yml up -d

コンテナが起動するとデータベースの構築が開始されるので、以下のとおり「DATABASE IS READY TO USE!」とDockerのログに表示されるまで数分待ちます。

2024-04-20 02:45:22 The command completed successfully
2024-04-20 02:45:27 Prepare for db operation
2024-04-20 02:45:27 8% complete
2024-04-20 02:45:27 Copying database files
2024-04-20 02:46:38 31% complete
2024-04-20 02:46:38 Creating and starting Oracle instance
2024-04-20 02:46:59 32% complete
2024-04-20 02:47:04 36% complete
2024-04-20 02:49:48 40% complete
2024-04-20 02:49:48 43% complete
2024-04-20 02:50:05 46% complete
2024-04-20 02:50:05 Completing Database Creation
2024-04-20 02:50:07 51% complete
2024-04-20 02:53:03 54% complete
2024-04-20 02:53:03 Creating Pluggable Databases
2024-04-20 02:53:07 58% complete
2024-04-20 02:53:07 77% complete
2024-04-20 02:53:07 Executing Post Configuration Actions
2024-04-20 02:53:07 100% complete
:
:
2024-04-20 02:53:08 SQL> SQL> Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
2024-04-20 02:53:08 Version 19.19.0.0.0
2024-04-20 02:53:08 The Oracle base remains unchanged with value /opt/oracle
2024-04-20 02:53:08 The Oracle base remains unchanged with value /opt/oracle
2024-04-20 02:53:08 #########################
2024-04-20 02:53:08 DATABASE IS READY TO USE!
2024-04-20 02:53:08 #########################

データベースの構築が終了したらsqlplusでアクセスしてみます。

$ sqlplus / as sysdba

SQL> show parameter service;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------------------
service_names                        string      ORCL

次にブラウザで「https//localhost:5500/em」にアクセスしてみます。

ENTERPRISE MANAGERにアクセスできたのでOracle Databaseコンテナの作成は完了です。

あとはコンテナをビルドした時にスキーマやアプリケーションで使用する初期データをロードするなどDockerfileで設定する必要がありますが、先にWindows Serverのコンテナを作成することにします。