作成日 | 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をもっと詳しく知りたい方は、以下の書籍がお勧めです。
課題
コンテナを利用するメリットは、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のサービス変更に伴い、これらの操作が変更となる可能性があります。
関連情報
Hinemos v4.1 入門編① Hinemos を使ってみよう
Hinemos v4.1 入門編② Hinemos で監視してみよう
Hinemos v4.1 入門編③ Hinemos でジョブを動かしてみよう
Hinemos v4.1 入門編④ Hinemosで実運用を始めてみよう
お問い合わせ