Serf/Consulで管理を自動化! ~実践的な手法を紹介~

第3回 Dockerコンテナ群をSerfで管理する方法・詳細オプション

この記事を読むのに必要な時間:およそ 5 分

これまではSerfの基本的な使い方や,Serfで構成されたイベントハンドラの動きを見てきました。今回はSerfに関する連載のまとめです。複数の仮想サーバ上にも応用可能なように,Dockerコンテナでの活用方法をご紹介します。また,より詳細な設定方法についての理解も進めていきます。

Dockerコンテナ群をSerfで管理する方法

DockerはLinuxコンテナを簡単に起動・管理するためのツールです。Dockerの魅力は,単純にコンテナを操作できる点だけではありません。公開レポジトリであるDockerHubを使ったコンテナの共有や,Dockerfileと言う設定ファイルを使った構成管理の自動化などの利点があります。

コンテナ管理問題を解決するSerf

コンテナを多く立ちあげた時に発生するのは,沢山のコンテナを効率的に操作するのかという課題です。例えばコンテナ内のプロセス稼働状況や,設定ファイルの確認を行いたい場合を考えてみます。Dockerではsshdを稼働させなくとも,ホストOS側からdocker execコマンドを実行することにより,任意のコマンドを実行することができます。

docker execは,小回りの利く便利なコマンドです。しかし,操作対象のコンテナが1つや2つではなく,3つ・4つ・5つ……と数が増えると都度docker execを実行するのは手間になりがちです。また,操作対象が増えると,コンテナに対して適切な管理が必要になります(このコンテナの役割は何か? 何のアプリケーションを動かすのか? 誰が管理しているのか?)⁠

この問題を解決するために,テキストファイルやExcelなど,何らかの管理表を作成するのは1つの方法と言えます。とは言え,コンテナを簡単に立ち上げ,消せるのがDockerの利点です。これではコンテナ管理が面倒になり,本末転倒です。

そこで登場するのが,Serfを使ってコンテナ群を管理する方法です。Serfエージェントがクラスタを構成できるのは物理・仮想サーバ間だけでなく,コンテナとも通信することが可能です。Serfを使うことによって,次のような利点があります。

メンバー管理の自動化

Serfがコンテナのホスト名とIPアドレスを自動的に管理するため,コンテナの起動・停止時に人手で管理する必要がありません。

タグ機能でコンテナの役割を明確化

Serfはエージェントにタグを動的に付与でき,コンテナの役割や管理担当者の情報を動的に付与できます。

イベントハンドラでコンテナ内の一斉操作

コンテナにログインすることなく任意のコマンドを一斉に実行できます。開発環境やテスト環境を問わず,有用な機能です。

いずれも手動でも行えますが,Serfであれば正確かつ迅速に行うことができます。しかも,これまでの連載で見て来たように,Serfそのものを使うために覚えることは少ないため,低い学習コストで高い効率性を得られるようになります。

図1は1つのホスト上で複数のコンテナを管理するイメージです。この図ではホストOS側・コンテナ群どちらもSerfでクラスタを構成しています。もちろん,ホスト側が不要であれば,コンテナ群だけでクラスタを構成することもできます。IPアドレスはコンテナ間の通信で使うためのものです。ホストOS側は172.17.42.1で固定されているため,Serfエージェント起動時のクラスタへのジョイン先をこの172.17.42.1にしておくと便利です。

図1 SerfでLinuxコンテナを一括管理

図1 SerfでLinuxコンテナを一括管理

自動的にSerfクラスタを構成するDockerfile

Dockerでコンテナを起動・停止するたびに,ホスト側のSerfエージェントに自動追加・削除する方法を見ていきましょう。Serfのセットアップを自動的に行うコンテナイメージを作成しておき,そのイメージを使ってコンテナを起動し,自動的にSerfのクラスタに参加するものです。また,コンテナ内にログインしなくても操作できるように,イベントハンドラでbashを実行させてみます。

前提として,ホスト側では予めSerfエージェントがserf agent等のコマンドで起動しているものとします。この時,Docker上のコンテナと通信時に使用する172.17.42.1をバインドしている必要があります(通常は起動したままで自動的に認識しますが,serf agent -bind=172.17.42.1として明示することもできます)⁠

自動的にSerfを起動するためにはDockerfileを用います。Dockerには,コンテナ内部のOS設定やミドルウェア・アプリケーションを自動的に設定するための仕組みがあります。これはChefやPuppet・Ansibleのような構成管理ツールの機能を実現します。これを使う場合は,Dockerfileという名称のテキスト形式のファイルを作成し,中にどのような環境を構築するか定義します。

作業用のディレクトリを作成し,そこに移動したあと,以下のDockerfileを作成します。内容はcentosのコンテナイメージの使用を明示し,wgetunzipパッケージの取得を行っています。それからserfのアーカイブを取得・展開し,バイナリをコピーの後,自動的にserfを起動するものです。

FROM centos

RUN yum -y install wget unzip
RUN wget -O 0.6.4_linux_amd64.zip https://dl.bintray.com/mitchellh/serf/0.6.4_linux_amd64.zip
RUN unzip 0.6.4_linux_amd64.zip
RUN cp ./serf /usr/bin/serf

ENTRYPOINT ["serf"]
CMD ["agent","-join=172.17.42.1","-event-handler=query:ssh=/bin/sh"]

※ 実際のDockerfileは,この他にも様々な環境のセットアップやデーモンの稼働に関する記述を行います。Serfに関する箇所以外は,環境に合わせて書き換えてお使いいただくこともできます。

次に,このDockerfileを元にdocker buildコマンドを使い,イメージのビルドを行います。次の例ではserf-centosというタグを付けていますが,<ユーザ名>/serf-centosなど,任意のタグ名を使うことができます。

# docker build -t serf-centos .
Sending build context to Docker daemon  3.31 MB
Sending build context to Docker daemon
Step 0 : FROM centos
 ---> 9dbcac75201e
Step 1 : RUN yum -y install wget unzip
 ---> Using cache
 ---> 7d35b2710d1d
Step 2 : RUN wget -O 0.6.4_linux_amd64.zip https://dl.bintray.com/mitchellh/serf/0.6.4_linux_amd64.zip
 ---> Using cache
 ---> 6f943b9c59cd
(省略)
Successfully built 5aa497793ab2

画面上にSuccessfullyと表示されれば,正常にserf-centosという名称のコンテナイメージが作成できました。次は,このコンテナイメージを使って起動します。docker runコマンドを使い,コンテナをデーモンとして立ち上げてみます。

# docker run -d serf-centos
175dbd9034122edff3af72804c1a8cc8e968ebed5d53c25259e375f82b4b40f4

コンテナが正常に稼働しているかどうかは,docker psコマンドで確認することができます。ここでは自動的にSerfクラスタを形成しているか確認するためにserf membersコマンドを実行してみます。正常であれば,次のようにホスト側と起動したコンテナのホスト名・IPアドレスの情報を確認することができます。

# serf members
dev2.pocketstudio.net  172.17.42.1:7946  alive
3f42611e8fe7           172.17.0.10:7946  alive

同時に複数台の起動も試してみましょう。先ほど同様docker run -d serf-centosを数回実行した後,serf membersコマンドを実行します。次のように,やはり自動的に追加されていることが確認できます。

# serf members
dev2.pocketstudio.net  172.17.42.1:7946  alive
3f42611e8fe7           172.17.0.10:7946  alive
0f8a23cdc921           172.17.0.11:7946  alive
4bbedca26a70           172.17.0.14:7946  alive
175dbd903412           172.17.0.15:7946  alive

著者プロフィール

前佛雅人(ぜんぶつまさひと)

クリエーションライン株式会社 Technology Evangelist

ホスティングサービスで運用保守サポートに携わった後,現職へ。サポート業務や新技術検証・開発業務を行う。趣味で監視や自動化に関するOSS検証や翻訳を行うのが好き。辛口の日本酒が大好き。

Twitter:@zembutsu

コメント

コメントの記入