技術関連の覚書

案件でやったり自宅で試したことの覚書

ELKとdocker-compose

久しぶりにdocker-composeでELK(Elasticsearch,Logstash,Kibana)を動かしてみようと思った。

(後付け)最初につまづいた時点で、これ残しておくと解決に導く手順も残せそうと思い残してみることにした。

DBのアクセスパスチェックに使えたりしないかとふと思ったが、ELKをちゃんと使ったことがなかったので、まず使ってみよう。

どこかからdocker-compose.ymlを拾ってきて実行

github.com

ちょうど良さそうなので使ってみる。

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ git clone https://github.com/deviantony/docker-elk.git
Cloning into 'docker-elk'...
remote: Counting objects: 581, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 581 (delta 0), reused 0 (delta 0), pack-reused 570
Receiving objects: 100% (581/581), 110.68 KiB | 26.00 KiB/s, done.
Resolving deltas: 100% (202/202), done.
Checking connectivity... done.
isoroku@akagi:git clone https://github.com/deviantony/docker-elk.git
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose up -d
Unsupported config option for services service: 'elasticsearch'
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ 

docker-composeのオプションを確認するとserviceと言うオプションは確かに無い

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose 
Define and run multi-container applications with Docker.

Usage:
  docker-compose [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE           Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME   Specify an alternate project name (default: directory name)
  --verbose                 Show more output
  -v, --version             Print version and exit

Commands:
  build              Build or rebuild services
  help               Get help on a command
  kill               Kill containers
  logs               View output from containers
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pulls service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  up                 Create and start containers
  migrate-to-labels  Recreate containers to add labels

githubのページに行くと確かにこう書いてある Install Docker-compose version >= 1.6.

今入ってるバージョンは

@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose -v
docker-compose version: 1.3.3
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013

しばらく放置してたなあ…(ー▽ー;)

と言うわけで、docker-composeのアップデート

https://github.com/docker/compose/blob/master/CHANGELOG.md へ行って最新版の確認

今日現在 1.12.0 (2017-04-04)

Releases · docker/compose · GitHub へ行ってみると

curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

でインストールできると書いてある

一応、現在のdocker-composeのありかを確認

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ which docker-compose
/usr/local/bin/docker-compose

配置場所は問題なさそうなのでそのまま実行する。 その前に、パーミッション確認

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ ls -l /usr/local/bin/
合計 8096
-rwxr-xr-x 1 root root 8182592  6月 26  2016 docker-compose

sudo で実行だけど面倒なので sudo su -してrootになってしまう。

後は上のコマンドを実行してしばらく待つ

root@akagi:~# curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   600    0   600    0     0    775      0 --:--:-- --:--:-- --:--:--   774
 82 8076k   82 6646k    0     0   9529      0  0:14:27  0:11:54  0:02:33     0
curl: (56) GnuTLS recv error (-54): Error in the pull function.

orz….

今はこっちかな…..○| ̄|_

とりあえずやり直し

2回め失敗

(4/15追記)

docker-compose は

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose -v
docker-compose version 1.12.0, build b31ff33

バージョンは上がってるっぽいし、動くっぽい… この際だからこの状態で動くか見てみる。

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose 
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name (default: directory name)
  --verbose                   Show more output
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the name specified
                              in the client certificate (for example if your docker host
                              is an IP address)
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the compose file)

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

旧バージョンではオプションだったversionサブコマンド

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch$ docker-compose version
docker-compose version 1.12.0, build b31ff33
docker-py version: 2.2.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

ちゃんとバージョンが表示できた。

では、この状態で

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose up -d
Creating network "dockerelk_elk" with driver "bridge"
Building elasticsearch
Step 1/1 : FROM docker.elastic.co/elasticsearch/elasticsearch:5.3.0
 ---> ccec59a7dd84
Successfully built ccec59a7dd84
WARNING: Image for service elasticsearch was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Building logstash
Step 1/1 : FROM docker.elastic.co/logstash/logstash:5.3.0
 ---> b583a99a08a0
Successfully built b583a99a08a0
WARNING: Image for service logstash was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Building kibana
Step 1/1 : FROM docker.elastic.co/kibana/kibana:5.3.0
 ---> a21e19753b0c
Successfully built a21e19753b0c
WARNING: Image for service kibana was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating dockerelk_elasticsearch_1
Creating dockerelk_kibana_1
Creating dockerelk_logstash_1
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose ps
      Name             Command             State              Ports       
-------------------------------------------------------------------------
dockerelk_elasti   /bin/bash bin      Exit 78                             
csearch_1          /es-docker                                             
dockerelk_kibana   /bin/sh -c         Up                 0.0.0.0:5601->56 
_1                 /usr/local/bin/                       01/tcp           
                   ...                                                    
dockerelk_logsta   /usr/local/bin     Up                 0.0.0.0:5000->50 
sh_1               /docker-entr ...                      00/tcp           

elasticsarchが立ち上がってない

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose start elasticsearch
Starting elasticsearch ... done
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose ps
      Name             Command             State              Ports       
-------------------------------------------------------------------------
dockerelk_elasti   /bin/bash bin      Exit 78                             
csearch_1          /es-docker                                             
dockerelk_kibana   /bin/sh -c         Up                 0.0.0.0:5601->56 
_1                 /usr/local/bin/                       01/tcp           
                   ...                                                    
dockerelk_logsta   /usr/local/bin     Up                 0.0.0.0:5000->50 
sh_1               /docker-entr ...                      00/tcp           

では、docker-compose upしたときの内容を見てみるけどWARNINGは出てるけど、特に問題なさそう。 あ、もしかしてパーミッションが… 確認すると、別ユーザで作成したディレクトリだったのでパーミッションがなかった。 なので、所有者を共通のグループに、パーミッションを775に設定してやりなおし。

まず、一度落としてから今度は、 docker-compose up だけで実行

isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose down
Stopping dockerelk_logstash_1 ... done
Stopping dockerelk_kibana_1 ... done
Removing dockerelk_logstash_1 ... done
Removing dockerelk_kibana_1 ... done
Removing dockerelk_elasticsearch_1 ... done
Removing network dockerelk_elk
isoroku@akagi:/home/vm/virtualmachine/docker/elasticsearch/docker-elk$ docker-compose up
Creating network "dockerelk_elk" with driver "bridge"
Creating dockerelk_elasticsearch_1
Creating dockerelk_logstash_1
Creating dockerelk_kibana_1
Attaching to dockerelk_elasticsearch_1, dockerelk_logstash_1, dockerelk_kibana_1
elasticsearch_1  | /bin/bash: bin/es-docker: Permission denied
dockerelk_elasticsearch_1 exited with code 126
kibana_1         | fs.js:640
kibana_1         |   return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
kibana_1         |                  ^
kibana_1         | 
kibana_1         | Error: EACCES: permission denied, open '/usr/share/kibana/optimize/.babelcache.json'
kibana_1         |     at Error (native)
kibana_1         |     at Object.fs.openSync (fs.js:640:18)
kibana_1         |     at Object.fs.writeFileSync (fs.js:1333:33)
kibana_1         |     at save (/usr/share/kibana/node_modules/babel-core/lib/api/register/cache.js:35:19)
kibana_1         |     at _combinedTickCallback (internal/process/next_tick.js:67:7)
kibana_1         |     at process._tickCallback (internal/process/next_tick.js:98:9)
kibana_1         |     at Module.runMain (module.js:606:11)
kibana_1         |     at run (bootstrap_node.js:394:7)
kibana_1         |     at startup (bootstrap_node.js:149:9)
kibana_1         |     at bootstrap_node.js:509:3
dockerelk_kibana_1 exited with code 1
logstash_1       | Sending Logstash's logs to /usr/share/logstash/logs which is now configured via log4j2.properties
logstash_1       | [2017-04-15T15:02:18,387][FATAL][logstash.runner          ] An unexpected error occurred! {:error=>#<ArgumentError: Path "/usr/share/logstash/data" must be a writable directory. It is not writable.>, :backtrace=>["/usr/share/logstash/logstash-core/lib/logstash/settings.rb:420:in `validate'", "/usr/share/logstash/logstash-core/lib/logstash/settings.rb:202:in `validate_value'", "/usr/share/logstash/logstash-core/lib/logstash/settings.rb:118:in `validate_all'", "org/jruby/RubyHash.java:1342:in `each'", "/usr/share/logstash/logstash-core/lib/logstash/settings.rb:117:in `validate_all'", "/usr/share/logstash/logstash-core/lib/logstash/runner.rb:210:in `execute'", "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/clamp-0.6.5/lib/clamp/command.rb:67:in `run'", "/usr/share/logstash/logstash-core/lib/logstash/runner.rb:183:in `run'", "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/clamp-0.6.5/lib/clamp/command.rb:132:in `run'", "/usr/share/logstash/lib/bootstrap/environment.rb:71:in `(root)'"]}
dockerelk_logstash_1 exited with code 1

もう一度docker-elkのgithubへ行ってみて、SELinuxのところを見ると chcon -R system_u:object_r:admin_home_t:s0 docker-elk/ を実行しろと.. ただ、For example on Redhat and CentOS

Ubuntuの場合のchconコマンドは

masataka@akagi:/home/vm/virtualmachine/docker/elasticsearch$ chcon --help
使用法: chcon [OPTION]... CONTEXT FILE...
または:  chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
または:  chcon [OPTION]... --reference=RFILE FILE...
各 FILE の SELinux セキュリティコンテキストを CONTEXT に変更します。
--reference がある場合、各 FILE のセキュリティコンテキストを RFILE のものに
変更します。

Mandatory arguments to long options are mandatory for short options too.
      --dereference      シンボリック自体の代わりに、シンボリックリンクを辿っ
                         た先に適用する (この動作が既定)、
  -h, --no-dereference   参照先のファイルの代わりにシンボリックリンクに適用する
  -u, --user=USER        set user USER in the target security context
  -r, --role=ROLE        set role ROLE in the target security context
  -t, --type=TYPE        set type TYPE in the target security context
  -l, --range=RANGE      set range RANGE in the target security context
      --no-preserve-root  '/' を特別扱いしない (既定)
      --preserve-root     '/' に対する再帰的な操作を失敗させる
      --reference=RFILE  CONTEXT 値を指定するのに代わって RFILE の
                         セキュリティコンテキストを使用する
  -R, --recursive        ファイルとディレクトリを再帰的に操作する
  -v, --verbose          各ファイルを処理した時の診断を出力する

以下のオプションは -R オプションと併せて指定されたときにどのように階層を
横断するかの動作を変更します。2個以上指定されたときは最後のオプションの
み有効になります。

  -H                     コマンドライン引数がディレクトリに対するシンボ
                         リックリンクの場合に、リンクを辿る
  -L                     ディレクトリに対するシンボリックリンクに遭遇し
                         た時には全て辿る
  -P                     シンボリックリンクを辿らない (デフォルト)

      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
chcon の翻訳に関するバグは <http://translationproject.org/team/ja.html> に連絡してください。
Full documentation at: <http://www.gnu.org/software/coreutils/chcon>
or available locally via: info '(coreutils) chcon invocation'

docker-composeとUbuntuSELinux設定をもうちょっと調べてからやり直しだなあ