>   >  痴山紘史の日本CG見聞録:第13回:クラウド環境構築[複数コンテナの連携]
第13回:クラウド環境構築[複数コンテナの連携]

第13回:クラウド環境構築[複数コンテナの連携]

・grafanaの設定

grafanaはユーザーがブラウザ経由で蓄積されたメトリクスを確認するために使用するので、外部から接続できるようにホストのポートと接続する必要があります。docker-compose.ymlのservicesに以下の設定を追加します。

  grafana:
    container_name: grafana
    image: grafana/grafana
    volumes:
      - ./grafana/data:/var/lib/grafana
      - ./grafana/plugins:/var/lib/grafana/plugins
    links:
      - elasticsearch
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=secret
    networks:
      - default

portsで3000番ポートをホストと接続しています。docker runで-pオプションで指定していた内容です。こうすれば、コンテナ外からもホストマシンの3000番ポートにアクセスすることでgrafanaにアクセスできます。これまではElasticsearchも9200番ポートを公開していましたが、コンテナ間で通信を行うだけなので、defaultネットワーク内で通信すればいいため、削除しています。動作確認のために外部からアクセスする必要があれば、同様にportsで指定します。


・logstashの設定

続いてlogstashの設定をします。docker-compose.ymlのservicesに以下の設定を追加します。

  logstash:
    container_name: logstash
    build:
      context: ./logstash
      dockerfile: Dockerfile
    links:
      - elasticsearch
    volumes:
      - /etc/condor:/etc/condor
      - ./logstash/pipeline:/usr/share/logstash/pipeline
      - ./logstash/log:/opt/probes/log
    networks:
      - default

これまでとちがうのは、使用するイメージの指定をするためにimagesを指定する代わりに、buildになっているところです。これにより、logstash/Dockerfileを用いて新たなイメージを作成するようにしています。また、logstashの設定ファイルはイメージにもたせるのではなく、volumesを使用してマウントしています。

logstash/Dockerfileの内容は以下の通りです。

$ cat logstash/Dockerfile
FROM docker.elastic.co/logstash/logstash:6.6.0

USER root

RUN yum -y install curl git
RUN curl -O https://bootstrap.pypa.io/get-pip.py
RUN python get-pip.py
RUN rm get-pip.py

RUN pip install virtualenv
RUN pip install htcondor==8.7.10

RUN cd /opt && git clone https://github.com/fifemon/probes
RUN cd /opt/probes && virtualenv --system-site-packages venv
RUN /opt/probes/venv/bin/pip install supervisor influxdb
$

FROMで、ベースにするイメージを指定します。今回はdocker.elastic.co/logstash/logstash:6.6.0です。RUNは、イメージを作成するときに実行するコマンドです。RUNを読み飛ばせば、通常のコマンドと同じであることがわかります。

オリジナルイメージにはcurl、git、pipといったツールが含まれていなかったのでインストールしています。

RUN yum -y install curl git
RUN curl -O https://bootstrap.pypa.io/get-pip.py
RUN python get-pip.py
RUN rm get-pip.py

必要なツールがインストールできたら、さらにvirtualenv、htcondorをインストールします。

RUN pip install virtualenv
RUN pip install htcondor==8.7.10

続いてprobeを使用するためのvirtualenvの作成を行います。

RUN cd /opt && git clone https://github.com/fifemon/probes
RUN cd /opt/probes && virtualenv --system-site-packages venv
RUN /opt/probes/venv/bin/pip install supervisor influxdb

以上で、logstashでhtcondorモジュールを使用して、htcondorの情報を取得することのできるイメージが作成できます。


・supervisordを使用したコンテナ

続いて、probesのもうひとつの機能、supervisordを使用してメトリクスを取得するためのコンテナを作成します。docker-compose.ymlのservicesに以下の設定を追加します。

  probes:
    container_name: probes
    build:
      context: ./probes
      dockerfile: Dockerfile
    container_name: probes
    volumes:
      - ./probes/log:/opt/probes/log
    networks:
      - default

ここはもう何も説明の必要はないです。続いてDockerfileを見てみます。

$ cat probes/Dockerfile
FROM python:2.7

USER root

RUN pip install virtualenv
RUN pip install htcondor==8.7.10

RUN cd /opt && git clone https://github.com/fifemon/probes
RUN cd /opt/probes && virtualenv --system-site-packages venv
RUN /opt/probes/venv/bin/pip install supervisor influxdb

COPY etc/awsmonitor.cfg /etc/
COPY etc/condor-probe.cfg /etc/
COPY etc/supervisord.conf /etc/

CMD . /opt/probes/venv/bin/activate && exec supervisord
$

probesがPython3で動作しなかったので、python2.7環境をベースにイメージを作成します。このDockerfileの中で、いくつか新しいコマンドが使用されています。

COPYは、イメージ作成時にホストからファイルをコピーします。今回はファイルコピーをしましたが、volumesでマウントしてもいいかなとも思います。

CMDは、コンテナ実行時に実行されるコマンドです。ここでは、virtualenv環境の上でsupervisordを実行するようにしています。ただ、supervisordはデフォルトではデーモンとして実行されてしまうため、そのままではコンテナ実行時に起動されても即座に処理が返ってきて、そのままコンテナが終了してしまいます。それを避けるためにsupervisord.confでデーモンとして動作しないように設定をします。

$ cat probes/etc/supervisord.conf
## Supervisor

[supervisord]
logfile = /opt/probes/log/supervisord.log
childlogdir = /opt/probes/log
nodaemon = true # <== ここでsupervisord実行時にデーモン化しないようにしている

(以下略)
$

また、設定ファイル中で指定するパスもコンテナ化した環境に合わせて適切なものに変更しています。

最終的なディレクトリ構成は以下のようになります。

$ tree .
.
├── docker-compose.yml
├── Elasticsearch
│   ├── config
│   │   └── elasticsearch.yml
│   ├── data
│   └── logs
├── grafana
│   ├── conf
│   ├── data
│   └── plugins
├── logstash
│   ├── Dockerfile
│   ├── log
│   └── pipeline
│       └── logstash-fifemon.conf
└── probes
    ├── Dockerfile
    ├── etc
    │   ├── awsmonitor.cfg
    │   ├── condor-probe.cfg
    │   └── supervisord.conf
    └── log

14 directories, 8 files
$

また、docker-compose.ymlは以下のようになりました。

$ cat docker-compose.yml
version: '3.3'

services:
  elasticsearch:
    container_name: es01
    image: docker.elastic.co/elasticsearch/elasticsearch:6.6.0
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - ./Elasticsearch/data:/usr/share/elasticsearch/data
      - ./Elasticsearch/logs:/usr/share/elasticsearch/logs
      - ./Elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    networks:
      - default

  logstash:
    container_name: logstash
    build:
      context: ./logstash
      dockerfile: Dockerfile
    links:
      - elasticsearch
    volumes:
      - /etc/condor:/etc/condor
      - ./logstash/pipeline:/usr/share/logstash/pipeline
      - ./logstash/log:/opt/probes/log
    networks:
      - default

  graphite:
    container_name: graphite
    image: graphiteapp/graphite-statsd
    links:
      - elasticsearch
    networks:
      - default

  grafana:
    container_name: grafana
    image: grafana/grafana
    volumes:
      - ./grafana/data:/var/lib/grafana
      - ./grafana/plugins:/var/lib/grafana/plugins
    links:
      - elasticsearch
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=secret
    networks:
      - default

  probes:
    container_name: probes
    build:
      context: ./probes
      dockerfile: Dockerfile
    container_name: probes
    volumes:
      - ./probes/log:/opt/probes/log
    networks:
      - default

networks:
    default:

$

・fifemon起動

準備ができたので fifemonを起動します。Docker Composeで管理しているので、コマンドひとつで環境が立ち上がります。

$ sudo docker-compose up -d
Creating grafana ... done
Creating probes ...
Creating es01 ...
Creating graphite ...
Creating grafana ...

ここからさらにGrafana上でData Sourceの設定やダッシュボードの登録という作業は残っていますが、それは前回までで紹介済みなので省略します。

紙面の関係で細かい部分はかなり省略してしまったため、実際に手を動かしてみると「アレアレッ??」と思うところが出てきてしまうかもしれません。今回はクラウド環境を活用するために必要な知識の導入ということで、fifemon構築のための細かいお話というより、DockerfileやDocker Composeを用いたシステム構築ってこんな感じでやるんだなということを知っていただければと思います。

次回予告

次回は、クラウド環境構築のための前準備の続きとして、社内環境をクラウド環境とシームレスに統合するための準備についてご説明していきます。



第14回の公開は、2019年7月を予定しております。

プロフィール

  • 痴山紘史
    日本CGサービス(JCGS) 代表

    大学卒業後、株式会社IMAGICA入社。放送局向けリアルタイムCGシステムの構築・運用に携わる。その後、株式会社リンクス・デジワークスにて映画・ゲームなどの映像制作に携わる。2010年独立、現職。映像制作プロダクション向けのパイプラインの開発と提供を行なっている。新人パパ。娘かわいい。
    @chiyama

その他の連載