Dockerをモニタリングする

Docker( https://www.docker.com/ )をモニタリングする方法を紹介します。

Dockerコンテナの消費リソースを把握するには、Dockerが利用しているリソースの統計情報を参照します。 Dockerのリソースの統計情報はAPI( https://docs.docker.com/engine/reference/api/docker_remote_api/ )を利用して取得します。 また後方互換性のためにcgroupのファイルシステム経由でメトリックすることもできますが、現在は非推奨です。 技術的な詳細は公式ドキュメント(https://docs.docker.com/engine/admin/runmetrics/)を参照してください。

mackerel-plugin-dockerを利用する

Mackerelではmackerel-plugin-dockerを利用することで、各コンテナのリソース消費の統計情報を取得しカスタムメトリックグラフとして可視化できます。 mackerel-plugin-dockerは公式プラグイン集に含まれていますので、まずは公式プラグイン集をインストールします。具体的な手順はミドルウェアのメトリック可視化に公式プラグイン集を使うを参照してください。

公式プラグイン集がインストールできたら、以下の設定を/etc/mackerel-agent/mackerel-agent.confに追記します。

[plugin.metrics.docker]
command = ["mackerel-plugin-docker", "-name-format", "name"]

これにより、そのホスト上で動作するDockerコンテナのCPU使用率、メモリ消費量、IO使用量(IOPS、転送バイト数とキュー長)が可視化されます。

コンテナを新規に起動すると自動的にグラフに項目が追加され、コンテナを終了すると数時間後に自動的にその項目が見れなくなります。

mackerel-plugin-dockerでは、-name-formatでコンテナごとのメトリック名を指定しています。上の例ではnameを指定しており、各コンテナのNameを利用します。Nameはいくつかの方法で指定できますが、典型的にはdocker run--nameオプションで指定します( https://docs.docker.com/engine/reference/run/#name-name )。

  • -name-format
    • name .. コンテナのName
    • name_id .. コンテナのName + '_' + IDの先頭6文字
    • id .. コンテナのID
    • image .. コンテナのイメージ名
    • image_id .. コンテナのイメージ名 + '_' + IDの先頭6文字
    • image_name .. コンテナのイメージ名 + '_' + コンテナのName
    • label .. 指定したラベル( https://docs.docker.com/engine/reference/builder/#label )

label を指定した場合は、 -labelオプションでどのkeyを利用するかを指定します。

https://cdn-ak.f.st-hatena.com/images/fotolife/m/mackerelio/20150917/20150917161045_original.png https://cdn-ak.f.st-hatena.com/images/fotolife/m/mackerelio/20150917/20150917161041_original.png

また -method オプションでAPIではなくファイルシステム経由でメトリック情報を収集させることもできます。その場合は、 -method Fileと指定してください。ただし非推奨であることに注意してください。

mackerel-agentのDockerイメージ

mackerel-agentのDockerイメージを以下で提供しています。

https://hub.docker.com/r/mackerel/mackerel-agent/

これを利用することで、mackerel-agentを1つのコンテナとして起動することができ、下図のようにホストや他のコンテナを監視できます。

https://cdn-ak.f.st-hatena.com/images/fotolife/m/mackerelio/20150917/20150917161407.png

mackerel-agentをコンテナとして起動する

mackerel-agentイメージによりコンテナを起動するには次のコマンドを実行します。 <APIKEY>を所属するオーガニゼーションのAPI KEYで置き換えます。 enable_docker_pluginは、mackerel-plugin-dockerを動かすかどうかのフラグとなります。 auto_retirementは、コンテナ終了時にMackerel上のサーバーを自動的に退役させるかどうかのフラグになり、デフォルトではオフとなっています。 optsは、mackerel-agentに渡される引数となります。 --nameはコンテナ名となります。これらのオプションは必要に応じて変更してください。

docker run -h `hostname` \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/lib/mackerel-agent/:/var/lib/mackerel-agent/ \
  -e 'apikey=<APIKEY>' \
  -e 'enable_docker_plugin=1' \
  -e 'auto_retirement=0' \
  -e 'opts=-v' \
  --name mackerel-agent \
  -d \
  mackerel/mackerel-agent

他のコンテナのプロセスを監視する

他のコンテナのプロセスを監視するには、Dockerのlinkオプションを利用します。 link オプションを利用することで他のコンテナのIPアドレスやポート番号を環境変数経由で取得できます。 各環境変数は、prefixが <name>_PORT_<port>_<protocol> となり、prefixにIPアドレス(ADDR)、ポート番号(PORT)、プロトコル(PROTO)をそれぞれ加えた環境変数( prefix_ADDR, prefix_PORT, prefix_PROTO )で取得できます。

link オプションの詳細はDockerのドキュメントをご参照ください。 (https://docs.docker.com/userguide/dockerlinks/)

ここではmemcachedの例を紹介します。

まずmemcachedコンテナをmemcachedという名前で起動します。

docker run -d -P \
  --name memcached -p 11211:11211 \
  sylvainlasnier/memcached

次にMackerelのmemcachedプラグインの設定ファイルを準備します。 このファイルはホスト側に置きます。Dockerのlinkオプションにより、環境変数MEMCACHED_PORT_11211_TCP_ADDRでそのコンテナのIPアドレスが取得できます。

% cat /etc/mackerel-agent/conf.d/memcached.conf
[plugin.metrics.memcached]
command = "mackerel-plugin-memcached -host=$MEMCACHED_PORT_11211_TCP_ADDR"

最後にこのmemcachedコンテナとリンクしたmackerel-agentコンテナを起動します。 ここで-vオプションとincludeを利用して上の設定ファイルを読み込みます。

docker run -h `hostname` \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/lib/mackerel-agent/:/var/lib/mackerel-agent/ \
  -e 'apikey=<APIKEY>' \
  -e 'enable_docker_plugin=1' \
  -e 'auto_retirement=0' \
  -e 'opts=-v' \
  --link memcached:memcached \
  -v /etc/mackerel-agent/conf.d:/etc/mackerel-agent/conf.d:ro \
  -e 'include=/etc/mackerel-agent/conf.d/*.conf' \
  --name mackerel-agent \
  -d \
  mackerel/mackerel-agent

これでmemcachedコンテナを監視するmackerel-agentコンテナを起動できます。