【Docker】"また死んでる！！"コンテナの死活管理とセキュリティー

# "また死んでる！！"コンテナの死活管理とセキュリティー

![rancher-docker.png](https://qiita-image-store.s3.amazonaws.com/0/62822/72da51f6-163c-ca0d-c602-86a6a3943be4.png)

+ [RancherOSで本格的なサーバーを構築](http://qiita.com/okamu_/items/da52b4dc12221feca55c)で少し触ってみたのでメモ

## 経緯
+ 最近dockerが人気であるが、死活管理をしっかりしてないと **”コンテナが死んでた！！”** というケースはよくある
+ "slack"とかに「死んだぜぇ！」っと通知が来ればすぐに対応できそうだし、かっこいい
+ 今のdockerサーバーの状態がカッコよくグラフで出ると、かっこいい




## コンテナの死活管理

### 死活管理してくれるライブラリ
+ DATADOG(おすすめ)
+ Prometheus

### [DATADOG](http://qiita.com/okamu_/items/f6875d5bce2ac6752758#datadog-agent--dogstatsd)
![community-datadog.png](https://qiita-image-store.s3.amazonaws.com/0/62822/4f00f74a-d26d-7457-ae24-87e833cf2688.png)


+ DatadogとはITシステムのモニタリングクラウドサービスです。少し作業を行うだけでご自身のITシステムをモニタリングすることができます。
+ これを見て惚れました　[Datadogの本当の魅力とは](http://qiita.com/jhotta/items/e7e20a1acd797bf2665b)

#### 早速、導入してみる
+ 無料版と有料版があるが、今回は無料版を使う
+ 公式[DATADOG](https://www.datadoghq.com/)でアカウントを作成
+ add hostの画面で「Docker」とあるがAPIKeyのみをコピーしておく

![Screen Shot 2016-06-25 at 10.33.11.png](https://qiita-image-store.s3.amazonaws.com/0/62822/6291f50f-11ef-245a-e5f5-7da6ceac2b0d.png)


##### ○Rancherの場合

+ rancherの管理画面から「CATALOG」->「DATADOG」を選択

<img width="1680" alt="Screen Shot 2016-06-25 at 10.25.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/79753e25-145d-c1c1-6864-fca41ea9682a.png">

+ APIKeyの入力
+ 「Launch」すれば終了！あら、かんたん。

##### ○普通のDockerの場合(docker-compose)

+ docker-compose.yml

```
datadog-init:
  labels:
    io.rancher.scheduler.global: 'true'
    io.rancher.container.pull_image: always
    io.rancher.container.start_once: 'true'
  command:
  - /bin/true
  image: janeczku/datadog-rancher-init:latest
  volumes:
  - /opt/rancher
  net: none
datadog-agent:
  environment:
    API_KEY: xxxxxxxxxxxxxxxxxxxxxxxxxx
    DOGSTATSD_ONLY: 'false'
  labels:
    io.rancher.scheduler.global: 'true'
    io.rancher.sidekicks: datadog-init
  command:
  - supervisord
  - -n
  - -c
  - /etc/dd-agent/supervisor.conf
  entrypoint:
  - /opt/rancher/entrypoint.sh
  image: datadog/docker-dd-agent:11.0.570
  volumes:
  - /var/run/docker.sock:/var/run/docker.sock
  - /proc/:/host/proc/:ro
  - /sys/fs/cgroup/:/host/sys/fs/cgroup:ro
  volumes_from:
  - datadog-init

```


```$ docker-compose up```


#### 早速、アクセスしてみると

<img width="1672" alt="Screen Shot 2016-06-25 at 10.38.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/88532e33-9596-f882-a263-b2127d297d7c.png">

+ このイベントの画面では、コンテナが作られたよーとかのイベントが時系列で表示されるっぽい

#### dockerとslackのintegrationをインストールする

![Screen Shot 2016-06-25 at 10.41.09.png](https://qiita-image-store.s3.amazonaws.com/0/62822/887d06f2-cb4c-c131-b133-46c10ab711d7.png)

#### dashboardにdockerが追加されたので確認してみる
![Screen Shot 2016-06-25 at 10.43.47.png](https://qiita-image-store.s3.amazonaws.com/0/62822/46114838-a99b-d532-6b03-6642281e51d2.png)

#### dockerのグラフを覗いてみる


![Screen Shot 2016-06-25 at 10.44.51.png](https://qiita-image-store.s3.amazonaws.com/0/62822/a1402caa-68af-cb8b-d172-5b6535d07289.png)

+ すんげぇきれい！！！！

#### **「本題」コンテナが死んだらslackに通知を送るように設定する**

##### slack側での設定
+ 左上の設定できそうなメニューから「Apps&integrations」を選択
+ 「DATADOG」を検索して「Add Configrations」
+ 「Webhook URL」をコピーしておく

##### datadog側での設定
+ 先ほどのURLと通知したいチャンネルを入力

<img width="993" alt="Screen Shot 2016-06-25 at 10.49.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/cdb9f2a4-45a2-1f70-a9d2-689333910e20.png">

+ とりあえずOK

##### アラートの基準値の設定

+ 「Monitors」->「new Monitor」->「Metric」を選択

![Screen Shot 2016-06-25 at 10.55.56.png](https://qiita-image-store.s3.amazonaws.com/0/62822/6b448e35-a42e-9920-cbc9-0ffc19bf951c.png)

+ runコンテナーが１より下がるとslackに通知がなるように設定してみた
<img width="1680" alt="Screen Shot 2016-06-25 at 10.58.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/977c9b41-80f0-125d-a7bf-4a5472c13bba.png">

+ 通知がくるとこんな感じ

<img width="1038" alt="Screen Shot 2016-06-25 at 11.00.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/abbafeca-a12f-4c37-79a9-962012b73306.png">


+ これでひとまず、 **「死んでるやん！！」** が早めにわかるようになった

### [Prometheus](http://qiita.com/okamu_/items/f6875d5bce2ac6752758#prometheus)

![community-Prometheus.svg.png](https://qiita-image-store.s3.amazonaws.com/0/62822/35037bfe-1b28-e1a8-78fa-d47f30b1e3b3.png)

+ Prometheus とは　一般的な監視ツールのように、データの収集、数値の表示、グラフの表示、アラートを出す機能があります。それだけでなく、Prometheus は独自のデータモデルを持ち、クエリ言語を使って時系列データの評価やグラフ化を行えます。


#### 早速、導入してみる

##### ○Rancherの場合

+ rancherの管理画面から「CATALOG」->「Prometheus」を選択

<img width="1680" alt="Screen Shot 2016-06-25 at 09.55.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/9eec4244-5c5e-2051-0eee-05ca6b060ef0.png">


+ 「Launch」すれば終了！あら、かんたん。

##### ○普通のDockerの場合(docker-compose)

+ docker-compose.yml



```
graf-db:
  command:
  - cat
  tty: true
  image: infinityworks/graf-db:08
  links:
  - prometheus:prometheus
  volumes:
  - /var/lib/grafana/
prometheus-rancher-exporter:
  labels:
    io.rancher.container.create_agent: 'true'
    io.rancher.container.agent.role: environment
  tty: true
  image: infinityworks/prometheus-rancher-exporter:04
prometheus:
  ports:
  - 9090:9090/tcp
  labels:
    io.rancher.sidekicks: prom-conf
  command:
  - -alertmanager.url=http://alertmanager:9093
  - -config.file=/etc/prom-conf/prometheus.yml
  - -storage.local.path=/prometheus
  - -web.console.libraries=/etc/prometheus/console_libraries
  - -web.console.templates=/etc/prometheus/consoles
  tty: true
  image: prom/prometheus:0.18.0
  links:
  - ranch-eye:ranch-eye
  - node-exporter:node-exporter
  volumes_from:
  - prom-conf
grafana:
  ports:
  - 3000:3000/tcp
  labels:
    io.rancher.sidekicks: graf-db
  tty: true
  image: grafana/grafana:3.0.1
  links:
  - prometheus:prometheus
  volumes_from:
  - graf-db
prom-conf:
  tty: true
  image: infinityworks/prom-conf:11
  links:
  - ranch-eye:ranch-eye
  - node-exporter:node-exporter
  volumes:
  - /etc/prom-conf/
influxdb:
  ports:
  - 2003:2003/tcp
  - 8083:8083/tcp
  - 8086:8086/tcp
  - 8090:8090/tcp
  environment:
    GRAPHITE_BINDING: :2003
    GRAPHITE_DB: rancher
    PRE_CREATE_DB: grafana;prometheus;rancher
  image: tutum/influxdb:0.10
ranch-eye:
  ports:
  - 9104:9104/tcp
  labels:
    io.rancher.scheduler.global: 'true'
    io.rancher.container.dns: 'true'
  tty: true
  image: infinityworks/ranch-eye:03
  stdin_open: true
  net: host
node-exporter:
  labels:
    io.rancher.scheduler.global: 'true'
  tty: true
  image: prom/node-exporter:latest
  stdin_open: true

```

```$ docker-compose up```


#### アクセスしてみる(3000番ポートのほう)
+ 外部には公開したくないので.ssh/configにlocalFowardして3000番を転送する

+ container statusはこんな感じ

<img width="1680" alt="Screen Shot 2016-06-25 at 10.03.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/447ade38-3f44-6712-8c43-6459167fd600.png">


+ Host Statusはなんかかっこいい！

<img width="1680" alt="Screen Shot 2016-06-25 at 10.07.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/62102a35-1eff-e832-08dc-c55a70d152b5.png">


#### 特定のコンテナが死んだ時に通知を送る
+ なんとなくぐぐっただけだけど、通知はどうにかすればできるっぽいけど、面倒くさそう
+ [Docker で Sensu + Graphite + Grafana 環境構築](http://d.hatena.ne.jp/tomyhero/20150902/1441178794)
+ [http://docs.grafana.org/tutorials/hubot_howto/](http://docs.grafana.org/tutorials/hubot_howto/)
+ 今回は見送ります

## コンテナのセキュリティー
![community-rancher-bench-security.png](https://qiita-image-store.s3.amazonaws.com/0/62822/d4d52ac8-50ee-5ca2-fa08-0a5fdef523f2.png)


### コンテナのセキュリティーを警告してくれる
+ rancher-bench-security
+ docker-bench-security

### 導入してみる


#### ○rancherの人
+ rancher-bench-security
+ 「CATALOG」->「rancher-bench-security」

<img width="1678" alt="Screen Shot 2016-06-25 at 11.11.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/893365f4-1e4d-c3b8-1db7-6c601fe36bec.png">

+ 「Launch」でおわり

#### ○dockerの人
+ docker-bench-security

```
docker run -it --net host --pid host --cap-add audit_control \
    -v /var/lib:/var/lib \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/lib/systemd:/usr/lib/systemd \
    -v /etc:/etc --label docker_bench_security \
    docker/docker-bench-security
```

### アクセスしてみる
+ これも外部には公開したくないので、bench_securityコンテナの80ポートを適当に8888ポートにしてローカルフォワードしてwebからアクセスする

![benchmark_log.png](https://qiita-image-store.s3.amazonaws.com/0/62822/28a94a85-20f2-1703-f8ab-a516fc55f99e.png)

+ こんな感じで出る(githubのサンプル)
+ このwarmを修正しとかんといかんみたいやね


## まとめ
+ こんなわけで、なんとなく死活管理とセキュリティーについては大丈夫かなぁと
+ 前々から気になってた”Vuls”は、RancherOSが対応してないらしくて諦めましたが、対応したら使いたい

+ その他にも[Rancherで使えるライブラリ](http://qiita.com/okamu_/items/f6875d5bce2ac6752758)はたくさんあるし、今も増えているのでたくさん使っていきたい