Dockerコンテナ上にElasticsearchとKibanaの環境をつくる

概要

Dockerのお勉強として、Dockerを利用して、ElasticsearchとKibanaの環境をつくって見たいと思います。 また、複数のコンテナを扱うため、docker-composeを使用してみます。

Dockerの環境構築は下で記事でまとめました。 ugap.hatenablog.com

環境

  • Docker 1.11.1
  • docker-compose 1.7.1

構成

$ tree
.
├── docker-compose.yml
└── es_config
    ├── elasticsearch.yml
    ├── log4j2.properties
    └── scripts

docker-compose.yml

es: #--(1)
  image: elasticsearch:5 #--(2)
  ports:
    - "9200:9200" #--(3)
    - "9300:9300" #--(3)
  volumes:
    - "$PWD/es_config:/usr/share/elasticsearch/config" #--(4)
  environment:
    ES_JAVA_OPTS: "-Xms512m -Xmx512m" #--(5)

ki:
  image: kibana:5
  ports:
    - "5601:5601"
  links:
    - es
  environment:
    - ELASTICSEARCH_URL=http://192.168.33.10:9200
項番 説明
(1) elasticsearchの設定をesというサービス名で定義。
(2) elasticsearch公式のdockerイメージのversion5を指定。
(3) Elasticsearch で使用する HTTP用のデフォルトポートは9200、ノード間のコミュニケーション用に 9300を使用するため、ポートを公開する。
(4) es_configというディレクトリとelasticsearchを動かすdockerコンテナ上の/usr/share/elasticsearch/configのパスを紐づけ。
/usr/share/elasticsearch/configにはelasticsearchの設定ファイルelasticsearch.ymlが置いてある。(中身は後述)
(5) デフォルトではヒープサイズが2gのようで、下げてあげないとエラーがでてしまうので、ここで設定する。

Kibanaの設定も同様の考え方なので省略します。

elasticsearch.ymlの設定

http.host: 0.0.0.0 #--(1)

http.cors.enabled: true #--(2)
http.cors.allow-origin: "*" #--(3)
項番 説明
(1) HTTPサービスをバインドするホストアドレス。
(2) クロスドメイン通信を有効にする。
(3) 許容するドメインを指定。(今回は*としていますが、セキュリティ上のリスクがあります。)

実行

docker-composeを実行してみます。

$ docker-compose up -d

-dオプションでバックグラウンド実行になります。

ブラウザでhttp://192.168.33.10:5601/にアクセスしてみます。

f:id:uggds:20170716232919p:plain

うまく表示されました。

まとめ

docker-composeで複数のdockerコンテナを管理することができました。
elasticsearch、kibanaは様々なデータの解析・可視化をするのに注目されているOSSですが、設定できることがたくさんあるので、 一度つくった環境をどこでも作れるようにするansibleやdockerとのコラボが適しているなと思いました。

次はこの環境を利用して、何かKibanaで可視化してみたいと思います。

Vagrant + AnsibleでDocker環境をつくる

概要

Vagrant + Ansibleのお勉強です。
Macをコントロールマシンとして、Vagrantを使ってVirtualBox上にDockerインストール済みのCentOS7をセットアップします。
また、CentOS上のDocker以外の部分のプロビジョニングをAnsibleを使って構築します。

f:id:uggds:20170527130304p:plain

環境

  • Vagrant 1.8.1
    • box: williamyeh/centos7-docker
  • ansible 2.1.0.0

Vagrantのセットアップ

適当なディレクトリを作成し、Vagrantの初期化を行います。
次のコマンドを打つと、Vagrantfileという設定ファイルが作られます。
box名にはwilliamyeh/centos7-dockerを指定しています。
このboxは次のサイトでdockerと検索した結果の中から選びました。

Discover Vagrant Boxes - Vagrant Cloud

vagrant init williamyeh/centos7-docker

Vagrantfileができていると思います。 Vagrantfileを開いて、次の修正をおこないます。

  ・・・
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
   config.vm.network "private_network", ip: "192.168.33.10" #(1)
  ・・・
  config.vm.provider "virtualbox" do |vb| #(2)
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
    vb.memory = "1024" #(2)
  end #(2)

(1)内部ネットワーク(192.168.33.10)を利用してホストからゲストに接続できるようにします。
(2)メモリ数を増やしました。デフォルトだと480MBのようです。

プロビジョニングの設定

作成したCentOSには最低限のものしかインストールされていません。
作業をしていく上で必要な(筆者が個人的に)GitやVimzshなどをインストールする必要があります。
ただ、これらをゲストマシンを作るたびに手でインストールしていくのは面倒です。

そこで、Vagrantの自動プロビジョニングの機能を使います。
この機能を使用すると、Vagrantは起動後に自動的にソフトウェアをインストールするため、ゲストマシンがすぐ使用できるようになります。

詳しくは以下を参照してください。
Provisioning - Getting Started - Vagrant by HashiCorp

プロビジョニングにはAnsibleを使用します。
Vagrantfileに次の処理を記述してください。

  ・・・
  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   sudo apt-get update
  #   sudo apt-get install -y apache2
  # SHELL
  config.vm.provision "ansible" do |ansible| # (1)
     ansible.playbook = "provisioning/vagrant.yml" # (2)
     ansible.inventory_path = "provisioning/hosts" # (3)
     ansible.limit = 'all' # (4)
  end
end

(1)プロビジョニングにansibleをつかいます。
(2)ansibleのplaybookの場所を指定しています。
(3)ansibleのiventoryの場所を指定しています。
(4)ansible-playbook を実行するホストやグループを指定しています。

ansible-playbookの準備

先ほど記述した場所に設定ファイルを用意しておきます。

$ tree
.
├── Vagrantfile
└── provisioning
          ├── config
          │       └── .vimrc
          ├── hosts
          └── vagrant.yml

provisioningディレクトリを作成し、その階層にhostsファイルとvagrant.ymlファイルをつくりました。

hosts

 [vagrants]
 192.168.33.10 #(1)

(1)Vagrantfileで設定した内部ネットワークIPを記述します。

vagrant.yml

---
- hosts: vagrants
  become: yes
  user: vagrant
  tasks:
  - name: install packages #(1)
    yum: name={{ item }} state=installed #(2)
    with_items:  #(3)
      - zsh
      - vim
      - git
  - name: copy
    copy: src=./config/.vimrc dest=/home/vagrant/ owner=vagrant #(4)

(1)タスク名を指定します。
(2)yumでインストールするタスクです。インストールはwith_itemsに記載されたものを順に行います。
(3)ここに記載されたツールがインストールされます。
(4)srcのものをdestにコピーするタスクです。vimの設定ファイルをゲストマシンのhomeディレクトリに配置する設定をしています。

vagrantの実行

vagrantを実行します。
williamyeh/centos7-dockerが初めて使うボックスである場合、ダウンロードに時間がかかります。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'williamyeh/centos7-docker' is up to date...
==> default: A newer version of the box 'williamyeh/centos7-docker' is available! You currently
==> default: have version '1.11.1.20160506'. The latest is version '1.12.1.20160830'. Run
==> default: `vagrant box update` to update.
==> default: Clearing any previously set forwarded ports...
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
・・・省略・・・
==> default: Running provisioner: ansible... 
    default: Running ansible-playbook...

PLAY [vagrants] ****************************************************************

TASK [setup] *******************************************************************
ok: [192.168.33.10]

TASK [install packages zsh] ****************************************************
changed: [192.168.33.10] => (item=[u'zsh', u'vim', u'git'])

TASK [copy .vimrc] *************************************************************
changed: [192.168.33.10]

PLAY RECAP *********************************************************************
192.168.33.10              : ok=9    changed=8    unreachable=0    failed=0

仮想マシンが立ち上がった後にAnsibleによるプロビジョニングが始まったことが確認できます。

立ち上がった仮想マシンに接続して、zshvimやgitが使えることを確認します。

$ vagrant ssh
vagrant@localhost ~ $ zsh --version
zsh 5.0.2 (x86_64-redhat-linux-gnu)
vagrant@localhost ~ $ git --version
git version 1.8.3.1

最後に、目的であったDockerがインストールされていることも確認します。

vagrant@localhost ~ $ docker --version
Docker version 1.11.1, build 5604cbe

まとめ

はじめからDockerがインストールされたBoxを使うことで簡単に環境構築をすることができました。
また、今回はライトにしか使っていませんがansibleを使うことで冪等性の持った環境にすることもできました。

次回はこの環境を使って、Dockerコンテナ上にElasticsearch、Kibanaをたててみたいと思います。