Domino V10 の Docker イメージの作成、及びコンテナの運用性について、次のような観点で検証を行いました。

・再現性
 前回の当ブログでの検証では、Dockerコンテナを「docker run」コマンドで起動し、コンテナ内でDominoのインストールや設定などを行い、その構成を元に「docker commit」コマンドで新しいDockerイメージを作成するという方法を紹介しました。
 この方法では、同じ環境を作成するためには、毎回手動で行わなくてはなりません。 今回は、あらかじめ構成を記述した「Dockerfile」を使って、「docker build」コマンドで自動的にDockerイメージを作成します。

・可搬性
 作成されたDockerイメージ(で起動するコンテナ)は、実行するホストの環境に依存しない事が望ましいです。
 多くのDominoのDocker関連記事では、notesdataディレクトリーの保存場所をホストのファイルシステムにしていますが、これをDockerのボリュームにする事により、実行するホスト環境の影響を受けないDockerイメージを作成します。

・保守容易性
 Domino 10.0.1 と FP1 を適用した2つのDockerイメージを作成し、前述の環境を前提とした実行環境の切り替えを行います。

検証に使用した設定ファイル一式と手順を掲載しますので、ご自身でも検証されたい方は、参考にしてください。
添付したいずれのファイルも、検証などで使用する際は、ご自身の責任において事前に内容の確認を行ってください。XPages.JPでは、本ファイルを使用したことによりいかなる損害が発生してもその責を負いません。

 

検証環境

これは、WindowsにDocker環境を構築して検証する手順です。今回はAzure上のWindows Server 2019を使用しましたが、基本的にはWindows10でも変わりません。
また、LinuxのDocker Imageは、CentOS 7.5.1804を使用しました。(Domino V10のサポート対象となるCentOSについては、こちらのリンク先に記載があります。)

(注)
本手順では、コマンドの表記に、下記を使用します。
Windowsのコマンドプロンプト: C:\>
Linuxのrootユーザーのプロンプト: #
Linuxのnotesユーザーのプロンプト: $

 

事前準備

0. Windows 環境に、Docker環境を構築する。(手順は、前回の当ブログを参照してください。)

1.Domino V10のLinux版のインストーラー、日本語ランゲージパック、及びFP1の用意

2.Domino のインストール及びセットアップ用の応答ファイルを作成する。
Domino のインストールから、サーバーのセットアップまでを、自動実行するために、A~Cの3つのファイルを用意します。
さらに、FP1のサイレントインストール用の応答ファイルDを用意します。

<A.Dominoサーバーインストール用の応答ファイル>
Dominoサーバーのインストーラーを解凍すると、サンプルのresponse.datが用意されているので、エディターで適宜編集します。

Dominoサーバーをサイレントインストールする時の、コマンドは以下の通りです。(Linux版)
# ./install -silent -options <fullpath>/response.dat

<B.日本語ランゲージパックインストール用の応答ファイル>
日本語ランゲージパックを解凍すると、サンプルのLPSilent.iniが用意されているので、エディターで適宜編集します。

LPSilent.ini ファイルの設定項目一覧は、こちらのリンク先に記載があります。

日本語ランゲージパックをサイレントインストールする時の、コマンドは以下の通りです。(Linux版)
# ./SilentInstallL64.sh <fullpath>/LPSilent.ini

サイレントインストールの詳細は、こちらのリンク先の説明を参照してください。

<C.Dominoサーバーサーバーセットアッププロフィール>
サーバーセットアッププロフィールを作成するには、Dominoサーバーのプログラムを使用します。こちらは、Windows の Domino サーバーを利用した方が簡単です。

Domino サーバーのプログラムファイルをインストール(未セットアップ)した Windows 環境で、
c:\> nserver -record
を実行します。


プロフィール名を入力し、画面の指示に従い必要な値を入力すると、拡張子pdsのファイルが作成されます。

Dominoサーバーをサイレントセットアップする時の、コマンドは以下の通りです。(Linux版)
$ /opt/ibm/bin/server -silent -options <fullpath>/<filename>.pds

<D.FP1のサイレントインストール用の応答ファイル>
FP1を解凍すると、サンプルのscript.datが用意されているので、エディターで適宜編集します。

FP1をサイレントインストールする時の、コマンドは以下の通りです。(Linux版)
# ./install -script <filepath>/script.dat

※上記ABDの3つのテキストファイルについては、検証に使用したものを参考として添付します。
Cのファイルは、テキストファイルではないため、ダウンロードしても内容の確認ができないという理由で添付を見送りました。
 

Dockerfile の作成

Domino のインストールから、サーバーのセットアップまでを一気通貫で行い、Docker イメージを作成する Dockerfile を作成しましたので、添付します。主な処理内容は、#で始まる行のコメントを見ていただければ、理解できるかと思いますので、何点か補足の説明を記載します。

1.ADD について
ADDは、ソースファイルをターゲットディレクトリに配置するコマンドです。

ADD <Sourcefile> <Target Directory>

本Dockerfileでは、ソースファイルは docker build コマンドを実行するカレントディレクトリに存在することを前提としています。
(例 ADDするファイル類を、c:\temp などに集めておいて、そこでdocker buildを実行する)
また、ADD は、圧縮ファイルを自動的に解凍します。そのため、DOM_SVR_V10.0.1_64_BIT_Lnx.tar などは、ターゲットディレクトリに解凍された状態で配置されますので、後工程で解凍の処理を記述する必要はありません。

2.RUN について
RUN でコマンドを実行すると、都度イメージのレイヤーが作成されます。不要なレイヤーの作成を防ぐためには、8行目のyumコマンドの様に、なるべく複数のコマンドをまとめて実行する事が望ましいです。
ただし、本Dockerfileは可読性を重視し、RUN を無理にまとめていませんので、その旨留意してください。

3.VOLUME について
VOLUME 行では、/local/notesdata をボリュームとして永続化するための宣言を行っています。ここは、当ブログの前回の検証と大きく異なるところです。
Docker コンテナのボリュームのマウントについては、複数の種類がありそれぞれ特徴が異なるので、後継の「ボリュームのマウントについて」で、さらに説明します。

 

ボリュームのマウントについて

Docker のコンテナから、コンテナ外のデータを扱う方法は、3つあります。
・bind mount
・volume
・tmpfs mount


Manage data in Docker | Docker Documentation より引用

tmpfs は、メモリなので、ここでは割愛します。
bind mount は、ホストの任意のディレクトリをコンテナ内にマウントするものです。本ブログの前回の検証では、C:\IBM\Domino\Data をコンテナにマウントしていました。
volume は、docker が管理する領域内に作成したデータを、マウントするものです。コンテナの外でデータが管理されるため、コンテナを削除してもデータが消えることはありません。
今回の検証では、bind mount ではなく、volume を使用します。

Dockerを使って環境構築をする利点は、どこでも誰でも同じ環境が手に入れられる事にあります。そのため、Dockerfile内では、ホストのディレクトリ構成を指定することはできません。
ホストに同じディレクトリ構成を作るのではなく、Dockerイメージを使うユーザー自身が、コンテナを起動する際に、書き換えの発生するデータ領域をどこに置くかを指定するという事です。
 

また、前回の検証では
docker run -v c:/IBM/Domino/Data:/local/notesdata
のように指定して、ホストのディレクトリをマウントしていましたが、今回は現在推奨されている指定方法である、mountを使用することにします。

 

Docker イメージ作成手順

あらかじめ、c:\temp に、Dockerfile と インストールに必要なファイル一式を配置する。Windows のコマンドプロンプトで、下記のコマンドを実行する。

C:\> cd c:\temp
C:\> docker build -t domino:10.0.1 .

「domino:10.0.1」は作成されるDockerイメージの名前(+ラベル)です。末尾の「.(ドット)」は、「Dockerfile」の場所がカレントディレクトリである事を指定しています。
CentOS のダウンロードから、Dominoサーバーのセットアップまでを行うため、相応の時間がかかります。(検証を実施した環境では、約20分程度かかりました。)

正常に終了したら、イメージが作成されていることを確認する。
c:\> docker images

 

Docker ボリュームの作成手順

Windows のコマンドプロンプトで、下記のコマンドを実行する。
c:\> docker run --rm --volume vol-notesdata:/local/notesdata domino:10.0.1

「vol-notesdata」は、作成されるボリュームの名前です。
--rm により作成されたコンテナは終了後削除され、ボリュームのみが残ります。これを行う理由は、無作為にコンテナを作成すると無名のボリュームが作成されてしまい、後で判別ができなくなることと、一度作成されたボリュームの名前を変更する事ができないからです。

正常に終了したら、ボリュームが作成されていることを確認する。
c:\> docker volume ls

 

Docker コンテナの起動手順

Windows のコマンドプロンプトで、下記のコマンドを実行する。
c:\> docker run --name domino_10.0.1 --hostname domino1 --mount type=volume,src=vol-notesdata,dst=/local/notesdata -e "TZ=Asia/Tokyo" -p 8585:8585 -p 80:80 -p 1352:1352 -it domino:10.0.1 /bin/bash

--hostname domino1 コンテナのホスト名として「domino1」を指定する
--mount type=volume,src=vol-notesdata,dst=/local/notesdata あらかじめ作成しておいたボリュームを、/local/notesdataにマウントする

コンテナが起動して、プロンプトが表示されたら、以下のコマンドを実行し、Dominoサーバーの起動を確認する。
# su - notes
$ cd /local/notesdata
$ /opt/ibm/domino/bin/server

 

FP1 の適用手順

前項で起動したコンテナが停止している場合は、下記のコマンドで開始する。
c:\> docker start -a -i domino_10.0.1

(前項から引き続き行う場合は、一旦Dominoサーバーを停止して、rootユーザーに戻ってから)
# cd /home/notes/tmp/FP1/linux64/domino
# ./install -script ./script.dat

FP1の適用が正常終了したら、Dominoサーバーを起動して確認する。
# su - notes
$ cd /local/notesdata
$ /opt/ibm/domino/bin/server

ユーザーnotesをログアウトしrootに戻り、さらにログアウトして、CentOSのコンテナを停止する。
$exit
#exit
(Windowsのコマンドプロンプトに戻る)

コンテナをコミットし、新しいDockerイメージを作成する。
c:\>docker container commit domino_10.0.1 domino:10.0.1FP1

以上で、「domino:10.0.1」「domino:10.0.1FP1」という2つのDockerイメージが作成されました。

 

Dominoサーバーのバージョンを切り替えるには

FP1を適用したDockerコンテナは下記のコマンドで作成・起動できます。
c:\> docker run --name domino_10.0.1FP1 --hostname domino1 --mount type=volume,src=vol-notesdata,dst=/local/notesdata -e "TZ=Asia/Tokyo" -p 8585:8585 -p 80:80 -p 1352:1352 -it domino:10.0.1FP1 /bin/bash

停止しているコンテナを開始する場合は、
c:\> docker start -a -i domino_10.0.1
または、
c:\> docker start -a -i domino_10.0.1FP1

ノーツデータディレクトリ(/local/notesdata)の実体は、コンテナの外部にあってマウントしているので、元の10.0.1とFP1を適用した環境を、簡単に切り替える事が可能となります。

 

Dockerを他の実行環境で実行する

windows環境で作成したDockerイメージを、別のホスト環境(CentOS)に転送して、動作を確認します。

windows環境で、dockerイメージをエクスポートする。
C:\> docker save domino:10.0.1 > domino.tar

Windows環境から、ファイルを転送する。
(具体的な手順は割愛します)

Linux環境で、dockerイメージをインポートする。
# docker load < domino.tar



Dockerボリュームを作成する。
# docker run --rm --volume vol-notesdata:/local/notesdata domino:10.0.1

コンテナを起動する。
# docker run --name domino_10.0.1 --hostname domino1 --mount type=volume,src=vol-notesdata,dst=/local/notesdata -e "TZ=Asia/Tokyo" -p 8585:8585 -p 80:80 -p 1352:1352 -it domino:10.0.1 /bin/bash

Dominoサーバーを起動して、最初に作成した環境と同じものである事を確認する。

 

まとめ

・再現性
 適切なDockerfileを用意する事により、均質なDockerイメージを再生産する事ができました。開発環境・テスト環境等、目的に応じたインフラ環境構築の手間の改善が期待できます。

・可搬性
 Dockerイメージの配布により、ホストの環境に依らずに、同じ実行環境を再現する事ができました。複数の開発者間で、同等の実行環境をすばやく準備するのに役立つでしょう。

・保守容易性
 更新データを外出しのボリュームにする事により、異なるバージョンを切り替えて実行する事ができました。運用している環境を止めずに別のバージョンのコンテナを用意する事や、不具合発生時には元の環境に切り戻す事が容易になるでしょう。

 

<添付ファイル>

サイズファイル名
1 KB Dockerfile
22 KB unix_response.dat
1 KB LPSilent.ini
2 KB script.dat