2を、コンテナ環境に導入する手順を紹介します。Edition(以下、Oracle11gR2と表記)をインストールする検証を行った。その際、Oracle11gR2のインストールを成功させるためにはポイントが存在することが分かった。本稿では、このOracle11gR2をインストールするためのポイントについて解説する。本稿の想定読者は、CentOSにOracle11gR2をインストールした経験がある人とする。本論に入る前に、本検証を行うことになった背景について軽く説明させていただきたい。Frameworkという名称のJava用フレームワークが存在する。本フレームワークは多くのミドルウェアに対応しているため、様々なミドルウェアの組み合わせによるテストを行う必要がある。機材の都合で、1台のホストに複数のミドルウェアをインストールする必要があるのだが、以下の問題に遭遇しているため、Dockerを検証することとした。遭遇した問題Dockerに期待すること当初は複数バージョンで検証する予定がなかったミドルウェアについて、後から複数バージョンでの検証が必要になった際、ミドルウェアごとに環境変数やポートを切り替える方法がアドホックになりがちである。その結果、時間が経つにつれ、クリーンな環境を保つのが難しくなる環境変数などをコンテナに閉じ込められるため、クリーンな環境の維持が容易になる上記の対策として、Xen等の仮想環境の使用も検討したが、将来的にIaaSに移行したいため、仮想環境の採用は足かせになる可能性がある。テストの際に起動と停止を頻繁に行うことが想定されるため、OSから起動しているとテストの実行時間が長くなってしまう恐れがある様々なIaaSで使用できるため、将来のIaaSへの移行が容易と思われる。起動が速いため、コンテナの起動と停止のせいでテストが遅れることがない環境変数等の切り替えの都合により、通常とは異なる方法でのインストールを行いがちであるため、ミドルウェアのアンインストールが困難であり、不要になっても放置しがちになるコンテナとimageを破棄するだけで良いため、アンインストールが簡単になる環境変数等の切り替えの都合により、通常とは異なる方法でのインストールを行いがちであるため、再インストールが必要になった際に、インストール方法が思い出せず多大な時間が掛かるDockerFileにインストール手順が記録されるため、再インストールが必要になった際に楽である以下に、計画したテスト環境の構成図を示す。※Dockerコンテナは一部のみ記載※各コンテナは、使用するときのみ起動する環境構築に先立ち、いくつかのミドルウェアをコンテナ上で動作させる検証を行い、その対象の一つにOracle11gR2が存在した。EditionをインストールするためのDockerfileは見つからなかったため、インストールの段階から検証することとしたのが、今回のテストの背景である。検証は以下の環境で行った。作業は以下の手順で行った。x86-64用のOracle11gR2のインストーラをダウンロードする。Dokcer上で動作するイメージの多くは64bitOS用であるため、64bit用のインストーラを使用する。ダウンロードしたZIPファイルは、CoreOS上で展開しておくOracle11gR2のレスポンスファイルとoraInst.locファイルを用意する。GUIのインストーラを使うためにはXの導入が必要になるため、今回はCLIでインストールするホスト側の環境設定を行う。Dockerはカーネルをホストと共有するため、ホスト側でもカーネルのパラメータの設定を行っておくDockerfileを用意する。Dockerfileには、Oracle11gR2のインストーラを起動するまでを記述する。Dockerfileにインストーラの起動を記述しないのは、以下の理由による。buildを実行する。この際、Oracle11gR2のインストーラ起動のために、必要な引数をつける必要があるコンテナ内で環境設定を行う。commitする作成したimageを使用してOracle11gR2を起動と停止の確認を行う本稿では、主に手順1、手順5から手順13について解説する。さくらのクラウドでインスタンス起動さくらのクラウドで起動するサーバは、以下のスペックを推奨する。仮想化によるオーバーヘッドはそれほど多くないため、1コアでもOracle11gR2は起動できる。CoreOSがデフォルトで/tmpに割り当てるサイズは、メモリの半分程度である。後述するが、Oracle11gR2の自動メモリ管理で使用するためにコンテナの/dev/shmに、ホストの/tmpを割り当てる。Oracle11gR2のDockerのImageは、10GB以上になることがある。Imageとコンテナで使用するディスク容量を踏まえると、40GB以上のディスクを使用した方が良いホスト側の環境設定ホスト側では、以下の項目を設定する。カーネルのパラメータOracle11gR2のインストール要件を満たすために設定が必要である。カーネルのパラメータに対してチューニングを行う際、ホスト側とコンテナ側のどちらにカーネルのパラメータを設定する必要があるのか、Dockerのドキュメントから記述をみつけることができなかった。そのため、本稿ではホストとコンテナの双方に設定することとする。スワップ領域Oracle11gR2のイストーラー起動時の環境チェックに合格するために必要。検証の結果、ホストに設定したスワップ領域をコンテナが使用することが分かっているため、ホストにスワップ領域を割り当てる(CoreOSは、デフォルトではスワップ領域を割り当てない)。CoreOSを使用したホストにカーネルのパラメータを設定する方法を、以下に示す。/usr/share/oem/cloud-config.ymlを編集する追記する内容の例は、以下の通りだ。1048576ホストを再起動する設定値の確認/proc/sys/以下の値を表示して、設定値が有効になっていることを確認する。kernel.shmallの値を確認する際は以下のようになる。/proc/sys/kernel/shmall1073741824CoreOSを使用したホストにスワップ領域を割り当てる方法を以下に示す。今回はディスク容量の都合で512MBを割り当てることとした。ファイルの作成スワップ領域として使用するためのファイルを作成する。/512MiB.swap設定ファイルの作成ホストOS起動時にスワップ領域をマウントするため、systemdの設定ファイルを作成する。設定ファイルは/etc/systemd/system/swap.serviceというファイル名で作成した。作成した設定ファイルを有効化するために、以下のコマンドを実行する。/proc/meminfoを実行してスワップ領域が割り当てられていることを確認する。SwapTotalの項に、割り当てたスワップファイルの容量が表示される。kBDockerfileの準備Dockerfileでは以下の処理を行う。ベースとなるイメージの指定。Databaseパッケージ要件」の項を参考に調査した。パッケージのインストール部分を、Dockerfileから抜粋する。\sysstat「Oracle11gR2のインストールに必要なOSのユーザとグループの作成」については、ちょっとしたテクニックが存在する。通常、対話なしにパスワードを設定したユーザを作成するには、暗号化済みのパスワードを作成しておいてそれをuseraddの引数に設定する。セキュリティ的に平文で保存しても構わない場合は、ユーザ作成後chpasswdでパスワードを設定することで、パスワードを平文で記述することが出来る。以下に、ユーザ作成とパスワード設定の例を示す。以下の例では、Oracleのホームディレクトリにインストールを行うため、所有者とパーミッションの設定も併せて行っている。/opt/oracleインストーラ等のコンテナへのコピーについては、いったんコンテナ内の作業用ディレクトリにコピーしたのちに、必要なものについてはさらに別の場所にコピーしている。作業用ディレクトリにコピーする必然性はないが、その方がDockerfileの構造についてわかりやすく感じるため、そのようにした。以下にコマンドの例を示す。runでコンテナを起動する。起動時に、以下の環境設定を行う。Dockerの特権モードを指定コンテナ内でのmountコマンドの実行および、カーネルのパラメータを書き換える際に必要となる。プロセス数のリミットの設定Oralceの推奨設定を満たすために設定する必要がある。run時にrootユーザ用の設定を行う。1.6からは、--ulimitオプションで設定可能になった。/dev/shmの割り当てOracleの自動メモリ管理を使用する際に必要な設定である。「/dev/shmの割り当て」について補足する。コンテナの/dev/shmにはデフォルトで64MBが割り当てられているが、これではOracle11gR2の自動メモリ管理を使用するためには小さすぎる。コンテナの/dev/shmを増やすためには、ファイルシステムが「tmpfs」となっているホストのディスク領域を割り当てる。ファイルシステムの確認のために、ホストでdfコマンドを実行した結果を以下に示す。/usr/share/oem/tmpがtmpfsなので、コンテナの/dev/shmをそこに割り当てることとする。runのコマンド例は以下の通りである。runでコンテナを起動後、コンテナ内で以下の設定を行う。カーネルパラメータの設定インストールに使用するユーザ(oracleユーザ)に対する、プロセス数のソフトリミットの設定カーネルパラメータは、通常は/proc以下に値を書き込めないため設定できない。/proc以下に値を書き込むには二つ方法が存在する。/procを読み書き可能として再マウントするホストの適当なディレクトリを/procとしてマウントする今回は、項番1の方法でカーネルパラメータの設定を行った。以下にカーネルパラメータの設定のためのコマンドを示す。run時の--ulimit引数で設定したプロセス数のソフトリミットは、コンテナに入った後、suで切り替えたユーザには値が引き継がれない。インストール前にoracleユーザに切り替えるため、再設定が必要となる。以下にoracleユーザに切り替えた後、ソフトリミットを設定するためのコマンドを示す。2048Oracle11gR2のインストーラの実行Oracle11gR2のインストーラを起動する前に、database/stage/cvu/cvu_prereq.xmlのRUNLEVELの設定を編集する。これは、Oracle11gR2のインストーラがランレベルを厳格にチェックし過ぎるためである。インストーラが存在するディレクトリに移動して、以下のコマンドを実行する。stage/cvu/cvu_prereq.xmlOracle11gR2のインストーラは、以下の例のようにレスポンスファイルのパスを指定して起動する。/data/db_install.rspインストーラ実行中、以下のメッセージが表示される。execコマンドでコンテナに入って、メッセージ中で指定されているスクリプト(/opt/oracle/product/11.2/root.sh)を実行しよう。continueインストーラの実行終了までには、筆者の環境で30分前後掛かった。インストール中に問題があった場合には、「<インベントリのディレクトリ>/logs/」に存在するログを確認すると良い。インベントリのディレクトリは、レスポンスファイル内でINVENTORY_LOCATIONというキーで指定しているはずである。起動の設定として以下を行う。自動起動を有効にするために、/etc/oratabを編集する。以下のように最終行の末尾の「N」を「Y」にする。Database管理者リファレンスを参考に、以下のように実装した。ポイントは、dbstart実行前に、プロセス数のソフトリミットを設定することである(ハードリミットはコンテナ起動時に毎回設定するか、dockerデーモン起動時に設定しておく)。;;esac#exit実装後は、rootユーザで実行できるように権限を付与する。run時に実行するシェルスクリプトでは、以下の処理を行う。カーネルのパラメータの設定カーネルのパラメータは、dockerのimageに記録されないため、コンテナ起動時に毎回設定する。listener.oraに含まれるホスト名の置換コンテナ起動時にホスト名が決まるため、listener.oraに記載されているホスト名に置換する。stop時、dockerはフォアグラウンドのプロセスにしかシグナルを送らない。そのため、フォアグラウンドのプロセスがシグナルを受信したらOracle11gR2を停止するように実装を行う。この設定をしない場合は、コンテナ停止前に手動でOracle11gR2を停止する必要がある以下に実装例を示す。10done実装後は、rootユーザで実行できるように権限を付与する。/root/start.shまた、oracleユーザの.bash_profileについても編集しておく。commitコンテナ内で各種設定が終わったら、インストール時に自動的に起動したOracle11gR2を停止したのちに、コンテナを停止する。以下にOracle11gR2の停止とコンテナの停止を行うコマンドの例を示す。rootユーザでのexitコンテナ起動時にshを指定しているはずなので、rootユーザでexitを実行した際に、シェルと同時にコンテナが終了するはずである。コンテナを停止したらimageをコミットする。コミットする際には、コンテナ開始時に起動するスクリプトも併せて指定する。以下にコマンドの例を示す。images」を実行する。oracle11gR2の起動と、プロセスの起動を確認した際の例を示す。ora.*xe.*上記の手順で起動しない場合は、以下の点を確認しよう。/tmp内の確認ホストの/tmpに、「ora」から始まる名前のファイルが大量に存在していないか確認する。Oracle11gR2が異常終了した際、/tmpにゴミが残るため/tmpの空きが不足して起動に失敗することがある。run時にshを指定して起動し、コンテナに入ってからスタートアップスクリプトを実行して、何かエラーメッセージが表示されていないか確認する。