hidemium's blog

日々学んだことをアウトプットする。

Elasticsearch + Kibanaを起動するDockerfileを書いてみた

前回、sensuでDockerコンテナを監視することができたため、今回はDockerコンテナの監視を可視化するための前段階として、最近注目されているサーチエンジンであるElasticsearchを起動するDockerfileを書いてみました。また、Elasticsearchのフロントエンドを提供するKibanaも合わせてインストールします。

構成

Ubuntu 12.04: サーバ構築対象
Ubuntu 12.04はDocker 1.0.0上で動作しています。

Dockerfile

Dockerfileの構成

Dockerfileの構成は以下の通りです。

elasticsearch
├──Dockerfile
├──id_rsa.pub            ... 公開鍵
├──sources.list          ... ミラーサイト一覧
├──config.js             ... Kibanaの定義ファイル
├──default.conf          ... nginxの定義ファイル
├──elasticsearch.conf    ... supervisorの定義ファイル(Elasticsearch用)
├──nginx.conf       ... supervisorの定義ファイル(nginx用)
└──supervisord.conf    ... supervisorの定義ファイル

Dockerfile

Dockerfileを以下のように作成します。

$ mkdir -p docker/elasticsearch
$ cd docker/elasticsearch
$ vi Dockerfile
FROM ubuntu:12.04

MAINTAINER hidemium

# Ubuntu update
ADD sources.list /etc/apt/sources.list
RUN apt-get -y update

# Install ssh
RUN apt-get -y install openssh-server
RUN apt-get -y install python-setuptools
RUN apt-get clean
RUN easy_install supervisor

RUN mkdir /var/run/sshd
RUN echo 'root:root' | chpasswd

# config sshd
ADD id_rsa.pub /root/id_rsa.pub
RUN mkdir /root/.ssh/
RUN mv /root/id_rsa.pub /root/.ssh/authorized_keys
RUN chmod 700 /root/.ssh
RUN chmod 600 /root/.ssh/authorized_keys
RUN sed -i -e '/^UsePAM\s\+yes/d' /etc/ssh/sshd_config

# config supervisor
RUN mkdir -p /var/log/supervisor
RUN mkdir -p /etc/supervisor/conf.d/
ADD supervisord.conf /etc/supervisord.conf

# Install Java
RUN apt-get install -y python-software-properties debconf-utils
RUN add-apt-repository ppa:webupd8team/java
RUN apt-get update
RUN echo "oracle-java7-installer shared/accepted-oracle-license-v1-1 boolean true" | debconf-set-selections
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get install -y oracle-java7-installer

# Install Elasticsearch
RUN apt-get install -y curl
RUN curl http://packages.elasticsearch.org/GPG-KEY-elasticsearch | apt-key add -
RUN echo "deb http://packages.elasticsearch.org/elasticsearch/1.2/debian stable main" >> /etc/apt/sources.list.d/elasticsearch.list
RUN apt-get update
RUN apt-get install -y elasticsearch
RUN /usr/share/elasticsearch/bin/plugin -install mobz/elasticsearch-head
ADD elasticsearch.conf /etc/supervisor/conf.d/elasticsearch.conf

# Install Kibana
RUN apt-get install -y unzip
RUN wget http://download.elasticsearch.org/kibana/kibana/kibana-latest.zip
RUN unzip kibana-latest.zip
RUN mv kibana-latest /usr/local/kibana
ADD config.js /usr/local/kibana/config.js

# Install Nginx
RUN echo "deb http://nginx.org/packages/ubuntu/ precise nginx" >> /etc/apt/sources.list.d/nginx.list
RUN echo "deb-src http://nginx.org/packages/ubuntu/ precise nginx" >> /etc/apt/sources.list.d/nginx.list
RUN curl http://nginx.org/keys/nginx_signing.key | apt-key add -
RUN apt-get update
RUN apt-get install -y nginx
ADD nginx.conf /etc/supervisor/conf.d/nginx.conf
ADD default.conf /etc/nginx/conf.d/default.conf

# Expose ports.
EXPOSE 22 80 9200 9300

# Define default command.
CMD ["supervisord", "-n"]
  • 「RUN echo "oracle-java7-installer shared/accepted-oracle-..」と「ENV DEBIAN_FRONTEND noninteractive」は、Javaのライセンス承諾画面を飛ばすためにやっています。
  • 「RUN /usr/share/elasticsearch/bin/plugin -install mobz/elasticsearch-head」は、 elasticsearch-headを使用できるようにプラグインをインストールしています。

Dockerfileの中で、読み込みを行っているファイルは以下の通りです。

sources.list

日本のミラーサイトを指定しています。

$ cat sources.list
deb http://jp.archive.ubuntu.com/ubuntu precise main restricted
deb-src http://jp.archive.ubuntu.com/ubuntu precise main restricted
deb http://jp.archive.ubuntu.com/ubuntu precise-updates main restricted
deb-src http://jp.archive.ubuntu.com/ubuntu precise-updates main restricted

config.js

Kibanaのconfig.jsを環境に合わせて修正しています。

$ cat config.js
:
    /*
    elasticsearch: "http://"+window.location.hostname+":9200",
     */
    elasticsearch: "http://<IPアドレス>:9200",
:

default.conf

kibanaにアクセスできるように、nginxのdefault.confを修正しています。

$ cat default.conf
:
    #location / {
    #    root   /usr/share/nginx/html;
    #    index  index.html index.htm;
    #}

    location / {
        root   /usr/local/kibana/;
        index  index.html index.htm;
    }
:

supervisord.conf

supervisorの設定とsshdの起動を定義しています。

$ cat supervisord.conf
[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket

[include]
files = /etc/supervisor/conf.d/*.conf

[program:sshd]
command=/usr/sbin/sshd -D
autostart=true
autorestart=true

elasticsearch.conf

Elasticsearchの起動を定義しています。

$ cat elasticsearch.conf
[program:elasticsearch]
command=/usr/share/elasticsearch/bin/elasticsearch -f
autostart=true
autorestart=true

nginx.conf

Nginxの起動を定義しています。

$ cat nginx.conf
[program:nginx]
command=/usr/sbin/nginx -c /etc/nginx/nginx.conf
autostart=true
autorestart=tru

Elasticsearchコンテナの起動

以下のコマンドで、Dockerfileからビルドし、Dockerコンテナの起動を行います。

$ sudo docker build -t ubuntu-elasticsearch:12.04 .
$ sudo docker run -d -p 22 -p 80 -p 9200:9200 -p 9300:9300 ubuntu-elasticsearch:12.04

Dockerコンテナの80番ポートにフォワードしているポート番号を確認します。

$ sudo docker port <コンテナID> 80
0.0.0.0:<ポート番号>

「http://<サーバのIPアドレス>:<ポート番号>」にアクセスし、Kibanaに接続できることを確認します。

f:id:hidemium:20140714023026p:plain

また、「http://<サーバのIPアドレス>:9200/_plugin/head」にアクセスし、 elasticsearch-headに接続できることを確認します。

f:id:hidemium:20140714023139p:plain