Tech-circle #4 Consul勉強会 -ハンズオン編-

# ハンズオン手順

実施予定時間

項目1・2「Consulインストールから起動まで」
<b>19:50-20:10</b>

項目3「Consul Client障害検知～自動復旧体験」
<b>20:10-20:30</b>

[Link]
[準備編](http://qiita.com/_BSmile_/items/c43484ee31885b89c081)
[ハンズオン編](http://qiita.com/_BSmile_/items/fa6e6c19e05fec1bb52a)
[Extra Stage](http://qiita.com/_BSmile_/private/f788e27c064aab2697ba)

## 1 Master Container作成

* イメージのダウンロード

[※準備編の「5. Containerベースダウンロード」にて実施済み](http://goo.gl/dyykGy)

```bash
sudo: unable to resolve host consul
REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
bsmile/consul-handson   latest              a4f420dc2b88        6 hours ago         292 MB
```

## 2 Consul Agent起動

###  2.1 Consul-Server立ち上げ

####  2.1.1 Consul Server設定

* consulサーバ用コンテナ立ち上げ

```bash
$ sudo docker run --name consul-sv1 -p 8500:8500 -i -t bsmile/consul-handson /bin/bash
```

<b>ここからはコンテナ(consul-server)上の設定となります。</b>

####  2.1.2 Consulサーバ IP確認

eth0のIPアドレスをメモして下さい。
consul-clientから接続する際に必要となります。

```bash
root@64e2fd981f5e:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
4: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 5e:b1:51:6a:88:da brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5cb1:51ff:fe6a:88da/64 scope link 
       valid_lft forever preferred_lft forever
```
####  2.1.3 Consul Agent Server起動前準備

後半で使用する、フェイルオーバ時のスクリプトを編集しておきます。
下記スクリプトの「172.17.0.2」を、先ほど確認したconsul serverのeth0IPアドレスへ置き換えて使用して下さい。

```
# sed -i -e "s/consul-sv1/172.17.0.2/g" -e "s/techcircle\:consul/bsmile\/consul-handson/g" /opt/consul/scripts/consul_http_recovery.sh
```

####  2.1.4 Consul Agent( Server / WebUI )起動

```bash
# consul agent \
-bootstrap-expect 1 \
-server \
-node=consul-sv \
-data-dir=/opt/consul/dat \
-ui-dir=/opt/consul/webui/dist \
-client="0.0.0.0" &
```

完了後、[Ctrl+P → Ctrl+Q](http://goo.gl/cdtFO4)でコンテナから抜けて下さい。

<b>以上でConsul-server設定終わり</b>

###  2.2 Consul-Client立ち上げ

####  2.2.1 Consul Client設定

* consul コンテナ(client) 立ち上げ

下記スクリプトの「172.17.0.2」を、先ほど確認したconsul serverのeth0 IPアドレスへ置き換えて使用して下さい。
今回の起動は、[/bin/bash]ではなく、consul agent(client)を起動するスクリプトを実行させます。

```bash
$ sudo docker run --name consul-cl1 -p 10080:80 -i -t bsmile/consul-handson sh /opt/consul/scripts/consul-client-start.sh 172.17.0.2
```
consulを実行した際エンター等を押下しても応答がありませんが、フォアグラウンドで実行されるアプリケーションなので問題ありません。

完了後、[Ctrl+P → Ctrl+Q](http://goo.gl/cdtFO4)でコンテナから抜けて下さい。

* webブラウザから確認

http://dockerサーバIP:10080/

<b>Welcome to [コンテナID]</b>が表示される。

![Screenshot 2015-03-19 21:58:29.png](https://qiita-image-store.s3.amazonaws.com/0/47801/ad2cdfbf-075b-0175-e227-bec2bc343e3f.png)


* consulノード確認

http://dockerサーバIP:8500/

<b>NODESタブにコンテナID</b>が追加されている。

![Screenshot 2015-03-19 21:56:50.png](https://qiita-image-store.s3.amazonaws.com/0/47801/a7a7a586-3615-f2a6-7f18-b389e9fbc469.png)



###### 試しにwebサーバダウンさせてみましょう

```bash
$ sudo docker exec consul-cl1 service nginx stop
```

![Screenshot 2015-03-19 22:16:36.png](https://qiita-image-store.s3.amazonaws.com/0/47801/683aacf7-5d4e-a25d-41cb-994219b10bef.png)
<b>consulサーバのweb-uiをリロードすると、httpチェックがcriticalとなっている事がわかります。
この制御を利用してconsulサーバから新しいコンテナを作成します。</b>

* 再度nginx起動

```
$ sudo docker exec consul-cl1 service nginx start
```

##  3 Nginx停止時の自動フェイルオーバー

###  3.1 Consul Server設定

* 実行権限付与とconsulサーバによる監視処理実行

consul serverへ接続します。

```bash
$ sudo docker attach consul-sv1
```

consul watchコマンドにて、nginx監視に変化があった場合、[http_watch.sh]というスクリプトを実行させます。

```
# consul watch -http-addr=127.0.0.1:8500 -type=service -service=http /opt/consul/scripts/http_watch.sh &
```

完了後、[Ctrl+P → Ctrl+Q](http://goo.gl/cdtFO4)でコンテナから抜けて下さい。

###  3.2 フェイルオーバー確認

もう一度nginxサービスを停止させてみましょう。
今度は、consul watchにてnginxサービスステータスがpassing以外になった場合
1. 問題のconsulクライアントをメンバから除外
2. 上記クライアントコンテナ停止
3. 新規クライアントコンテナ作成
4. nginx起動
5. consulメンバーに参加
と流れるスクリプトが実行されます。

```bash
$ sudo docker exec consul-cl1 /usr/sbin/service nginx stop
```

<b>約1分以内にフェイルオーバ用のwebサーバが立ち上がります。</b>

* webブラウザから確認

http://dockerサーバIP:10080/

![Screenshot 2015-03-19 22:36:50.png](https://qiita-image-store.s3.amazonaws.com/0/47801/784605dd-1b22-f780-b16f-d2d82bfdf82c.png)


<b>Welcome to コンテナID</b>が表示される。

* consulノード確認

http://dockerサーバIP:8500/

![Screenshot 2015-03-19 22:36:37.png](https://qiita-image-store.s3.amazonaws.com/0/47801/993bd621-7f7e-3c54-2d0c-08bd18b651a6.png)


## おまけ

### dockerコンテナを扱う為のコマンド

##### /bin/bashで起動時、コンテナを停止させずに抜ける

```
# Ctrl+P の後に Ctrl+Q
```

##### /bin/bashが実行中のコンテナに再接続する

※ run実行時に、-i -t オプションが有効になっている場合

```
# docker attach コンテナ名(ID)
```