はじめに
こんにちは.@blue271828 です.
昨日12月19日は @FukMo10 さんの エンジニアが学生向け技術インターンを二年連続で企画から運営までやったのでまとめる でした.今日12月20日は,Mackerelを使ったDockerの監視について小ネタを紹介したいと思います.
Dockerとは
Dockerを知らない方に簡単に説明すると,DockerとはDocker, Inc.が提供している軽量な仮想環境みたいなもので,この仮想環境をコンテナと呼びます.厳密にはVM(仮想マシン)とは違うんですが,実行環境をそのまま Dockerイメージとして保存できるので,アプリを手軽に手元で動作確認したり,デプロイしたり,何かと便利に利用できます.
Mackerelとは
Mackerelとは,株式会社はてなが提供しているウェブベースのサーバ管理サービスです.監視したいサーバーにMackerelエージェントをインストールすることで,サーバーの状況を可視化したり,監視をしたりできます.ウェブベースのサービスなので構築いらずで,とても簡単に運用が開始できます.ちなみにMackerelの名前の由来はサーバー→鯖→Mackerelらしいです.
Dockerの監視
そんな便利なDockerとMackerelですが,なんと公式に Mackerel エージェント込みのDockerイメージ が公開されており,ホスト側へのインストールいらずで使い始めることができます.Docker コンテナのメトリクスを取得することができる公式の mackerel-plugin-docker も含まれており,設定ファイルに必要な記入を行えば簡単にメトリクス取得が開始されます.
ただ,こちらDockerコンテナ内のプロセス監視の機能が提供されていません.公式イメージには mackerel-check-plugins も含まれておりプロセス監視自体は行えるのですが,Dockerの仕様上Mackerelコンテナから別コンテナ内のプロセスを直接参照することは基本的にはできません.ちょっと困った状況ですが,少し工夫をすればコンテナ内のプロセス監視もできるようになります.ここでは,その方法を紹介したいと思います.
方法1:コンテナ内のプロセスをDockerコマンドで監視する
実は公式イメージでは,Dockerコンテナのメトリクスを取得する際に Docker APIを利用しており,コンテナ内のプロセスも同様の手続きで mackerel-check-plugins を使って確認することができます.
例えば hoge_cntr
コンテナの hoge_app
プロセスを確認する場合,以下のような設定を行うと docker exec
コマンドを使って確認することが可能です.
[plugin.checks.hoge_app]
command = 'docker exec hoge_cntr ps | grep hoge_app || exit 2'
方法2:HealthCheckオプションを使って監視する
もう一つの方法ですが,DockerのHealthCheckオプションを使う方法があります.Docker APIを経由して取得するのは同様ですが,HealthCheckではコンテナ単位で healthy
かどうか確認できるため,コンテナ内に複数プロセスを走らせている場合にまとめて確認することが可能です.注意点としては,そのコンテナが healthy
かどうかの仕様はコンテナに依存するため,コンテナにHealthCheckオプションの設定を適用する必要があります.
以下が設定例になります.hoge_app
の記述が必要ないため,コンテナ単位での管理ができるようになります.
[plugin.checks.hoge_cntr]
command = 'docker inspect --format "{{json .State.Health.Status}}" hoge_cntr | grep healthy || exit 2'
おわりに
過去に自分が同様の状況になったとき,少し困った経験があったため紹介してみました.ちょっとした工夫って見つからないときは,なかなか見つからなかったりしますよね.
さて明日12月21日は @tily さんの「[HR-Tech] 社員のプロフィールと会社の歴史を共有するためのマイクロサービス Profistory」です.お楽しみに.