Docker を利用して同一サーバ上に httpd の複数インスタンスを構築してみた

こんにちは。サイオステクノロジー OSS サポート担当 Y です。

今回は、Docker を利用し同一サーバ上で httpd の複数インスタンス環境を構築してみました。(※以下の内容は CentOS 7.6/Docker 18.09.2/httpd 2.4.38 にて検証しています。)

■はじめに

こちらの記事でも紹介しておりますが、Apache HTTP Server (以下 httpd) に限らず、同一サーバ上で同じミドルウェア (プロセス) を起動する場合、起動スクリプト/.pid ファイル/設定ファイル/Listen する port/プロセスのワーキングディレクトリ/データの格納先等々、様々な要素を考慮 (分離) する必要があり、構築手順が複雑になってしまうことが多いのではないかと思います。

また、構築が上手くいっても、その後の運用で発生した障害に対する対応 (エラーの原因切り分けや対処等) や保守作業 (パッチ適用や構成変更) も複雑になってしまい、保守/運用工数が膨らんでしまう恐れもあります。

そこで今回は、最近流行りのコンテナ技術 (Docker) を使って、よりシンプルかつ簡単に、httpd の複数インスタンス環境 (同一サーバ上) を構築してみました。

■Docker のインストール

まずは、コンテナを利用するために Docker (コミュニティエディション) をインストールします。

こちらのドキュメントの内容を参考に、リポジトリから Docker (docker-ce) をインストールします。

インストールが完了後、Docker を起動し簡単な動作確認 (Hello World) を実行してみます。

これで Docker のインストールは完了です。

■httpd その1 の構築

それでは、1つ目の httpd インスタンス (コンテナ) を作成してみます。

Docker (コンテナ) を利用する場合、ベースイメージ (Debian や CentOS 等の OS のイメージ) 上に一から httpd をインストール (ソースコードからコンパイル等) することも可能ではありますが、Docker Hub にて httpd のオフィシャルイメージが公開されているので、今回はこのイメージを使って環境を構築してみます。

上記 httpd のオフィシャルイメージのページに記載されている情報を参考に、httpd で公開するコンテンツ (test.txt) と Dockerfile を作成します。

後程実施する環境構築後のテストのために、test.txt には “httpd その1” のインスタンスからのレスポンスであることが確認できるような内容を記載しておきます。

また、Dockerfile は実行するコンテナの設計図のようなものですが、Dockerfile の作成や Dockerfile で内に記載するコマンド等は情報量がとても多いので、詳細については割愛致します。興味のある方はこちらのドキュメントをご参照下さい。

test.txt と Dockerfile の作成が完了したら、それらのファイルを利用して Docker イメージを作成します。(初回の構築では “httpd:2.4.38” を Docker Hub からダウンロードする処理が発生します。)

次に、作成した Docker イメージを使ってコンテナを起動します。

この例では、コンテナに “httpd1” という名前を付け (–name httpd1)、ホスト側の 8001番 port 宛の通信をコンテナ内の 80番 port に転送 (-p 8001:80) する設定で、コンテナを起動しています。

netstat コマンドで確認してみると、docker-proxy というプロセスがホスト側の 8001番 port で LISTEN していることが確認できます。

これでコンテナの起動は完了したので、ホスト側の 8001番 port 宛に HTTP リクエストを投げてみます。

すると、先ほど用意したコンテンツ (test.txt) をレスポンスとして受け取ることができました。

これで 1つ目のインスタンスの構築は完了です。

■httpd その2 の構築

それでは、(ほぼ) 同じ手順で 2つ目のインスタンスも構築してみます。(ここからが本題です。)

1つ目のインスタンスと同じ様に準備を行いますが、2つ目のインスタンスの test.txt には “httpd その2” のインスタンスからのレスポンスであることが確認できるような内容を記載しておきます。

次に Docker イメージを作成しますが、既に “httpd:2.4.38” を Docker Hub からダウンロードしている (“httpd:2.4.38” がローカルに保存されている) ため、1つ目のインスタンス用のイメージ作成時とは異なり、ダウンロード処理は実行されません。

最後に、作成した Docker イメージから 2つ目のインスタンス (コンテナ) を起動します。

2つ目のインスタンス (コンテナ) 起動時の docker コマンドのオプションでは、コンテナ名 “httpd2” とホスト側で LISTEN する port “8002番” を指定してコンテナを起動します。

これで 2つ目のインスタンス (コンテナ) の起動も完了です。ホスト側の 8002番 port に HTTP リクエストを投げると、2つ目のインスタンスからのレスポンスが返ってくることが確認できます。

■複数インスタンス (コンテナ) の確認

前述した手順で 2つの httpd インスタンス (コンテナ) を同一サーバ上に構築することができたので、改めて Docker ホスト側からサーバの状態を確認してみます。

まず、docker ps コマンドで “2つのコンテナ” が起動していることが確認できます。また、PORTS の出力からホスト側の “8001”, “8002” 番の port への通信が、それぞれのコンテナに転送される設定になっていることが確認できます。

netstat にて、上記 PORTS (ホスト側の “8001”, “8002” 番) がホスト側で LISTEN していることも確認できます。

そして、それぞれのインスタンス (port) 宛に HTTP リクエストを投げると、それぞれのインスタンスからレスポンスを受け取ることができます。

また、ホスト側で ps コマンドにてプロセスを確認すると、以下の様に httpd プロセスが動作していることが確認できます。

上記の出力だと少し分かりづらいのですが、16272 と 16926 がそれぞれの httpd インスタンスの親プロセスです。pstree コマンドで確認すると、以下の様になっています。

また、各 httpd の親プロセス (16272 及び 16926) はコンテナとして実行されているため、Docker の裏側でコンテナを管理しているプロセスである “containerd” の子プロセスとして、各 httpd の親プロセスが実行されていることが確認できます。

このように、同一サーバ上 (Docker ホスト上) で 2つの httpd が動作していることが確認できました。無事に httpd の複数インスタンス環境が構築できたようです。

■おまけ

前述した検証ではインスタンス毎に Docker イメージを準備しましたが、以下の様に同一の Docker イメージを使って複数のインスタンスを動作させることも可能です。

■まとめ

今回は Docker (コンテナ) を使って同一サーバ上に httpd の複数インスタンス環境を構築してみました。

Docker (コンテナ) を利用すると、”コンテナ名” と “LISTEN する port” の 2つを分けるだけで複数インスタンス環境を構築することができました。しかも、(前準備が必要ですが) 基本的には docker コマンドのオプションに “コンテナ名” と “LISTEN する port” を指定するだけで実現できます。

また、コンテナ名を指定せずに起動するとランダムな名前が割り当てられるため、コンテナ名の管理等が不要な場合はコンテナ名の指定も省略することができますし、一度イメージを作成 (前準備を実施) してしまえば、docker コマンドを実行するだけで複数のコンテナを起動できます。

実際には Docker 自体の学習 (技術習得) が必要な部分もあるため一概に “簡単に” と言うことはできませんが、コンテナ技術を利用することで今までよりも簡単 (シンプル) に実現できることもあるのではないでしょうか。

また、httpd に限らず複数の製品のイメージが Docker Hub で公開されているため (試しに起動してみる等の) ちょっとした検証であればすぐに実施できることに加え、最近は Docker (コンテナ) に関する技術情報や事例も多くなってきているので、技術習得/情報収集のハードルも下がってきている様に感じます。

もちろん、Docker にもメリット/デメリットがありますし、今回の様な利用方法がユースケースとして合っているのか (アンチパターン的な使い方では無いか?) という懸念点もありますが、最近は Docker や Kubernetes 等のコンテナ関連技術が急速に成長し注目を集めているため、一度コンテナ技術に触れてみる価値はあるのではないでしょうか。

>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

2人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*