Dockerのコンテナを監視してみる(Hinemos ver.4.1編) 第1回

作成日 2015/3/23
更新日 2015/3/23

概要

DockerはDevOpsを代表する技術であり、システムの開発部門が運用(Ops)の領域も合わせて継続的にシステムを維持、改善してための有効なコンテナ技術です。しかし、Dockerを利用したからといって、従来からの運用部門の行ってきたシステム運用の部分が完全になくなるわけではありません。そこで、まずDocker環境における運用管理を、従来の運用部門の視点にて、何が出来て、または何を行わなくてはならないか、を把握する必要があります。

2015/1/28にリリースしたHinemos ver 4.1.3より、Red Hat Enterprise Linux 7/CentOS 7/Oracle Linux 7に対応したHinemosエージェントを公開しました。これらのOSでは、Dockerを使用してコンテナ型の仮想化環境が構築できます。そして、Hinemosエージェントは、これらのOS上のDocker環境に対して、ホスト・コンテナ上の動作をサポートします。また、Hinemosのもつ運用管理の基本機能を使って、Docker環境上のシステムの運用を実現することができます。

そこで、本技術情報では、Hinemos ver4.1を使ってDocker環境を運用管理する際のノウハウ、注意事項を紹介します。全3回予定で、第1回では、Docker Hub Registry のイメージを使って構築したコンテナ環境の監視を実行してみます。

<注意事項>
・Hinemos ver 4.1のマネージャの動作環境は、Red Hat Enterprise Linux 6/CentOS 6/Oracle Linux 6です。Red Hat Enterprise Linux 7/CentOS 7/Oracle Linux 7上で動作するHinemosマネージャは、Hinemos ver 5.0(2015.5リリース予定)にて対応予定です。

・Hinemos ver 5.0では、別途Docker対応を計画しています。本技術情報は、Hinemos ver 4.1の基本機能の範囲にて、各種ノウハウ、注意事項を紹介します。

<参考情報>
Hinemosの[実践]入門の本が出ました。Hinemosをもっと詳しく知りたい方は、以下の書籍がお勧めです。

Hinemos統合管理[実践]入門

課題

コンテナを利用するメリットは、OS上のレイヤで操作可能であることと、その軽量さにあります。そのため、運用管理に必要とはいえ、Hinemosエージェントをコンテナにインストールすることが必須であるとすると、各コンテナが消費するメモリリソースなどが多くなるなどのデメリットがあります。しかし、システムコンテナ的なイメージとして、コンテナ内に必要となるアプリやエージェントを一式インストールして、一括して管理という使い方もあります。

そこで、1コンテナ1アプリケーションのような、まさにアプリケーションコンテナ的利用方法と、1コンテナ複数アプリケーションのような、システムコンテナ的利用方法の2つがあるとし、第1回では、前者のアプリケーションコンテナ的利用方法の場合に注力して解説します。このような使い方の場合は、コンテナ内には必要最低限のプロセスのみを起動させます。そのため、コンテナ内に監視のためのエージェントプロセスをインストール・起動する方法ではなく、DockerのホストOS側の機能だけで監視が解決することが望ましいです。

メリット

Docker環境のシステム運用を、従来の運用部門の視点にて、課題や注意事項を整理できます。

前提条件

本技術情報では、Dockerに関する基礎的な解説、紹介は行いません。本技術情報のトピックを紹介するにあたり、必要な範囲のみを取り上げて解説します。

ターゲットの環境はAzure上の仮想マシンを利用していますが、インターネットに接続可能なCentOSまたは類するLinuxディストリビューションの環境でも動作が可能です。

対象環境

本技術情報全体にわたり、解説で使用するターゲット環境を説明します。

<ターゲット環境>

Azure環境のOpenLogic CentOS 7.0上にDockerをインストールし、各種コンテナを起動します。そして、OpenLogic CentOS 6.5にHinemosマネージャ v4.1をインストールし、Dockerの環境を運用管理してみます。

・Hinemosクライアント
 Windows 7 PC上にインストールします。
 Hinemosクライアントのインストール手順の紹介は割愛します。

・Hinemosマネージャ
 OpenLogic CentOS 6.5 on Azure 環境にインストールします。
 Hinemosマネージャのインストール手順の紹介は割愛します。

・Docker環境(監視対象)
 OpenLogic CentOS 7.0 on Azure 環境にインストールします。

CentOS 6.5と7.0の環境は、事前にSELinuxとファイアウォールを無効化しておきます。SELinuxの無効化の後は、OSの再起動が必要です。

[CentOS 6.6の場合]

                # vi /etc/selinux/config
                SELINUX=disabled
                # service iptables stop
                # chkconfig iptables off
                # reboot
                

[CentOS 7.0の場合]

                # vi /etc/selinux/config
                SELINUX=disabled
                # systemctl stop firewalld.service
                # systemctl mask firewalld.service
                # reboot
                

<参考情報>
OpenLogic CentOSは、CentOSとほぼ機能差無く操作可能です。

第1回目の今回は、Docker Hub Registry のイメージを使って構築したコンテナ環境の監視を実行します。

<第1回のターゲット>

アプリケーションコンテナの特徴を意識して、1コンテナ1プロセスな構成のコンテナ
をターゲットにし、コンテナをHinemosにノード登録せず以下の監視を実行してみます。

- postgres
 死活監視:SQL監視
 ログ監視:postgresql.log

- httpd
 死活監視:HTTP監視
 ログ監視:error_log

死活監視は、コンテナのポートをホストのポートにpublishし、そのホストのポートに対して行います。コンテナのログ出力ディレクトリをホストのディレクトリに共有して、ホスト側からログファイルを監視してみます。

ログファイルや、本技術情報で扱うPostgreSQLのデータベースクラスタは、実際は、データ専用のコンテナ(Data-only Container)などに格納するような検討が必要ですが、ここでは簡易に動作させるため、ホストのディレクトリに直接共有します。

ホストとコンテナで共有するディレクトリやマッピングするポートの設定は以下の通りです。

postgres ホスト コンテナ
ポート 15432 5432
共有ディレクトリ /var/docker/postgres/data /var/lib/postgresql/data

httpd ホスト コンテナ
ポート 8080 80
共有ディレクトリ /var/docker/httpd/htdocs/ /usr/local/apache2/htdocs/
/var/docker/httpd/logs/ /usr/local/apache2/

また、本技術情報ではDockerfileを記載せず済むように、簡易なコマンドのみで行える操作の範囲を目指しているため、あまり一般的ではない設定、動かし方を行っている点がありますが、ご了承ください。

実現方法/解決策

以下の項目を順に解説します。後半にDockerに関する操作を纏めて説明するため、本技術情報では、最初にHinemosエージェントのインストールを行います。

・Hinemosエージェントのインストール on CentOS 7.0
・Dockerインストール on CentOS 7.0
・コンテナの準備 on CentOS 7.0
・監視環境の準備(共通) on CentOS 7.0
・監視環境の準備(httpd) on CentOS 7.0
・監視環境の準備(postgres) on CentOS 7.0
・PostgreSQLコンテナ用の監視設定
・Apacheコンテナ用の監視設定

[Hinemosエージェントのインストール on CentOS 7.0]
・OpenJDKのインストール

                # yum install java-1.7.0-openjdk ?y
                

・Hinemosエージェントのインストール

                # tar -zxvf hinemos_agent-4.1.3_rhel5-7.tar.gz
                # cd Hinemos_Agent-4.1.3_rhel5-7/
                # ./agent_installer_JP.sh
                
                警告 : net-snmp に依存する機能(ノード自動登録、リソース/プロセス/SNMP監
                視、性能管理)が利用できません。
                net-snmpをインストールします。よろしいですか?(Y/N デフォルト:Y) :
                 ←以降は、全てY(Enter)にて押下してインストールを進めてください。
                

・Hinemosエージェントの起動

                # service hinemos_agent start
                

このCentOS 7.0の仮想マシンをHinemosマネージャにノードとして登録してください。ノードのファシリティIDは以下のようにします。
- ファシリティID:Docker

[Dockerインストール on CentOS 7.0]
・Dockerインストール

                # yum install docker -y
                # rpm -qa | grep docker
                docker-1.3.2-4.el7.centos.x86_64
                

・Dockerサービスを開始

                # systemctl start docker.service
                # systemctl enable docker.service
                

・Dockerサービスの状態を確認(1)

                # systemctl status docker.service
                docker.service - Docker Application Container Engine
                    Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
                    Active: active (running) since Sun 2015-03-01 08:18:34 UTC; 10s ago
                      Docs: http://docs.docker.com
                  Main PID: 2507 (docker)
                    CGroup: /system.slice/docker.service
                            mq2507 /usr/bin/docker -d --selinux-enabled -H fd://
                
                Mar 01 08:18:17 Docker docker[2507]: 2015/03/01 08:18:17 docker daemon:
                1.3.2 39fa2fa/1.3.2; execdriver: native; graphdriver:
                Mar 01 08:18:17 Docker docker[2507]: [1977fc6a] +job serveapi(fd://)
                Mar 01 08:18:17 Docker docker[2507]: [info] Listening for HTTP on fd ()
                Mar 01 08:18:33 Docker docker[2507]: [1977fc6a] +job init_networkdriver()
                Mar 01 08:18:34 Docker docker[2507]: [1977fc6a] -job
                init_networkdriver() = OK (0)
                Mar 01 08:18:34 Docker docker[2507]: [info] Loading containers:
                Mar 01 08:18:34 Docker docker[2507]: [info] : done.
                Mar 01 08:18:34 Docker docker[2507]: [1977fc6a] +job acceptconnections()
                Mar 01 08:18:34 Docker docker[2507]: [1977fc6a] -job acceptconnections()
                = OK (0)
                Mar 01 08:18:34 Docker systemd[1]: Started Docker Application Container
                Engine.
                

・Dockerサービスの状態を確認(2)

                # docker info
                Containers: 0
                Images: 0
                Storage Driver: devicemapper
                  Pool Name: docker-8:1-525245-pool
                  Pool Blocksize: 65.54 kB
                  Data file: /var/lib/docker/devicemapper/devicemapper/data
                  Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
                  Data Space Used: 307.2 MB
                  Data Space Total: 107.4 GB
                  Metadata Space Used: 733.2 kB
                  Metadata Space Total: 2.147 GB
                  Library Version: 1.02.84-RHEL7 (2014-03-26)
                Execution Driver: native-0.2
                Kernel Version: 3.10.0-123.13.2.el7.x86_64
                Operating System: CentOS Linux 7 (Core)
                

[コンテナの準備 on CentOS 7.0]
・リポジトリから入手

                # docker pull centos
                # docker pull postgres
                # docker pull httpd
                

※centosのイメージは第2回で使用します。

・Dockerリポジトリから入手したイメージの一覧を表示

                # docker images
                REPOSITORY          TAG                 IMAGE ID CREATED            
                VIRTUAL SIZE
                postgres            9.4                 6dc733527d22        10 days
                ago         214.2 MB
                postgres            9.4.1               6dc733527d22        10 days
                ago         214.2 MB
                postgres            latest              6dc733527d22        10 days
                ago         214.2 MB
                postgres            9                   6dc733527d22        10 days
                ago         214.2 MB
                centos              7                   dade6cb4530a        3 weeks
                ago         224 MB
                centos              centos7             dade6cb4530a        3 weeks
                ago         224 MB
                centos              latest              dade6cb4530a        3 weeks
                ago         224 MB
                httpd               2                   f90095a67f5b        4 weeks
                ago         159.4 MB
                httpd               2.4.12              f90095a67f5b        4 weeks
                ago         159.4 MB
                httpd               latest              f90095a67f5b        4 weeks
                ago         159.4 MB
                httpd               2.4                 f90095a67f5b        4 weeks
                ago         159.4 MB
                

[監視環境の準備(共通) on CentOS 7.0]
・ホストとコンテナで共有するディレクトリの作成

                # mkdir -p /var/docker/postgres/data
                # mkdir -p /var/docker/httpd/htdocs/
                # mkdir -p /var/docker/httpd/logs/
                

[監視環境の準備(httpd) on CentOS 7.0]
httpdのコンテナの使い方は、以下のURLを参考にしています。
https://registry.hub.docker.com/_/httpd/

・テストページの作成

                # vi /var/docker/httpd/htdocs/hello.html
                <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                         "http://www.w3.org/TR/html4/loose.dtd">
                <html lang="ja">
                         <head>
                                 <title>Hinemos World</title>
                         </head>
                         <body>
                                 <p>Hello, Hinemos World!</p>
                         </body>
                </html>
                

・httpdコンテナの起動
以下のコマンドを実行して、httpdコンテナを起動します。デーモン起動ではなく、FOREGROUNDの起動が必要です。また、ポートマップの設定(-p)やホストとコンテナを共有する設定(-v)、error_logを出力するように、httpdの起動オプションに-cで直接httpd.confのディレクティブを指定しています。

                # docker run -d -it --name my-apache-app -p 8080:80 -v
                /var/docker/httpd/htdocs/:/usr/local/apache2/htdocs/ -v
                /var/docker/httpd/logs/:/usr/local/apache2/logs/ httpd:2.4 httpd -D
                FOREGROUND -c 'ErrorLog "logs/error_log"'
                

起動が成功したかを、docker psコマンドで確認します。

                # docker ps -a
                CONTAINER ID        IMAGE               COMMAND CREATED            
                STATUS              PORTS                  NAMES
                4fd0da5fadf6        httpd:2             "\"httpd -D FOREGROU   8 seconds
                ago       Up 7 seconds        0.0.0.0:8080->80/tcp my-apache-app
                

また、apacheが正常に起動しているかを確認します。

                # curl http://localhost:8080/hello.html
                

もちろん、CentOS7.0環境内では、コンテナに割り当てられたIPで直接アクセスできます。「4fd0da5fadf6」は、上記docker psで確認した、httpdのコンテナIDです。次のコマンドでhttpdコンテナのIPアドレスを確認します。

                # docker inspect --format '{{ .NetworkSettings.IPAddress }}' 4fd0da5fadf6
                172.17.0.6
                

このIPを使って、apacheが正常に起動しているかも確認できます。

                # curl http://172.17.0.6/hello.html
                

また、/var/docker/httpd/logs/にapacheのログファイルが出力されていることを確認します。

                # find /var/docker/httpd
                /var/docker/httpd/
                /var/docker/httpd/htdocs
                /var/docker/httpd/htdocs/hello.html
                /var/docker/httpd/logs
                /var/docker/httpd/logs/error_log
                /var/docker/httpd/logs/httpd.pid
                

<参考情報>
もし引数のミスなどでコンテナの起動に失敗したら、不要なイメージが残ります。このようなイメージは再利用したいと思いますので、以下のコマンドでコンテナを削除します。

                # docker rm `docker ps -a -q`
                

確認のため、httpdコンテナの起動を対話的に実行するには、-dオプションをはずしてください。(-rmオプションで、停止時に削除するようにしています)

                # docker run -it --rm --name my-apache-app -p 8080:80 -v
                /var/docker/httpd/htdocs/:/usr/local/apache2/htdocs/ -v
                /var/docker/httpd/logs/:/usr/local/apache2/logs/ httpd:2.4 httpd -D
                FOREGROUND -c 'ErrorLog "logs/error_log"'
                

[監視環境の準備(postgres) on CentOS 7.0]
postgresのコンテナの使い方は、以下のURLを参考にしています。
https://registry.hub.docker.com/_/postgres/

まずホストから接続確認したいのでpsqlを使えるようにします。

                # yum install postgresql -y
                

postgresコンテナを、PGDATAのディレクトリをホストと共有するように起動します。

                # docker run --name some-postgres -e POSTGRES_PASSWORD=hinemos -p
                15432:5432 -v /var/docker/postgres/data:/var/lib/postgresql/data -d postgres
                

docker psコマンドで起動確認します。

                # docker ps -a
                CONTAINER ID        IMAGE               COMMAND CREATED            
                STATUS              PORTS NAMES
                f726469903a2        postgres:9          "/docker-entrypoint.   14
                seconds ago      Up 13 seconds       0.0.0.0:15432->5432/tcp some-postgres
                4fd0da5fadf6        httpd:2             "\"httpd -D FOREGROU   5 minutes
                ago       Up 5 minutes        0.0.0.0:8080->80/tcp my-apache-app
                

デフォルトでは、ファイルにログ出力されないため、postgresql.confを書き換えて、pg_logを出力させるようにします。

                # cp /var/docker/postgres/data/postgresql.conf
                /var/docker/postgres/data/postgresql.conf.org
                # vi /var/docker/postgres/data/postgresql.conf
                logging_collector = on
                #logging_collector = off
                

これでpostgresコンテナを再起動すると、/var/docker/postgres/data/pg_log配下にpostgresql.log が出力されるようになります。「f726469903a2」は、docker psコマンドで確認した、postgresコンテナのコンテナIDです。

                # docker stop f726469903a2
                # docker start f726469903a2
                

すると、共有しているディレクトリにログが出力されるようになります。

                # cat /var/docker/postgres/data/pg_log/postgresql-2015-03-01_092225.log
                LOG:  database system was shut down at 2015-03-01 09:22:17 UTC
                LOG:  database system is ready to accept connections
                LOG:  autovacuum launcher started
                

次に、psqlで接続し、簡単なデータを投入します。パスワードは、postgresコンテナ起動時に指定した、「hinemos」です。

                # psql -h 0.0.0.0 -p 15432 -U postgres
                CREATE TABLE test01 (col int);
                INSERT INTO test01 VALUES (1);
                INSERT INTO test01 VALUES (2);
                INSERT INTO test01 VALUES (3);
                INSERT INTO test01 VALUES (4);
                SELECT * FROM test01 ;
                \q
                

これで準備は環境しました。あとはHinemosクライアントから、Hinemosマネージャに接続し、ノード「Docker」に対する監視設定を行うだけです。

[PostgreSQLコンテナ用の監視設定]
SQL監視(数値)SQL01と、ログファイル監視(文字列)LOG_PG01を作成します。

・SQL監視(数値)SQL01
 スコープ:Docker
 接続先URL:jdbc:postgresql://#[IP_ADDRESS]:15432/postgres?loginTimeout=30&socketTimeout=600&tcpKeepAlive=true
 ユーザID: postgres
 パスワード: hinemos
 SQL文: SELECT count(*) FROM test01;
 閾値
   情報:0-10
   警告:10-20
   危険:それ以上

<SQL監視>

・ログファイル監視(文字列)LOG_PG01
 スコープ:Docker

 ディレクトリ:/var/docker/httpd/logs/
 ファイル名(正規表現):error_log

[Apacheコンテナ用の監視設定]
HTTP監視(文字列)HTTP01と、ログファイル監視(文字列) LOG_PG01を作成します。

・HTTP監視(文字列):HTTP01
 スコープ:Docker

 URL:http://#[IP_ADDRESS]:8080/hello.html
 パターンマッチ文字列
  .*Hinemos.* 情報

<HTTP監視>

・ログファイル監視:LOG_PG01
 スコープ:Docker

 ディレクトリ:/var/docker/postgres/data/pg_log
 ファイル名(正規表現):postgresql.*.log

イベント通知やステータス通知を行うと次のように見えます。

<監視結果>

今回は、アプリケーションコンテナ的な利用方法に対して、簡単な監視方法を解説しました。実際の開発環境・運用環境を意識したネットワーク設計などは別途必要ですが、これは次回以降のテーマとする予定です。

---

次回(第2回)は、Hinemosエージェントのコンテナへのインストール、コンテナのノード登録などを行い、リソース監視を実施する際の注意事項などを紹介します。

免責事項

本ソフトウェアの使用・本ドキュメントに従った操作により生じたいかなる損害に対しても、 弊社は一切の責任を負いません。

本ドキュメントの内容を実施すると、Azureにおいて料金が発生する場合があります。Azureの料金体系等を理解した上で操作を実施してください。 本ドキュメントにおいて、2015年2月現在の Azureのサービスに従い記載しておりますが、Azureのサービス変更に伴い、これらの操作が変更となる可能性があります。

関連情報

お問い合わせ