dockerとnginxでロードバランシング

## はじめに
ネットワークの勉強するのに実機買ったりクラウドサービス使うのはお財布に優しくないのでとりあえずdockerで色々試していきたいと思います。今回は手始めにサーバー二つ建ててnginxでロードバランシングします。
## 前提条件
dockerがインストールされていること
macユーザーであること(この記事はmac環境で作業するので)
##構成図
想定としてインターネットからLBめがけて降ってきたアクセスをclosedなネットワークにおいてあるサーバー2台に着弾させてあげる感じです。(ほんとはLBの前にFWとかあると良いんですけどそれはまた別の記事でやります...)
<img width="683" alt="スクリーンショット 2018-07-21 18.03.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/255246/bc33f044-2a68-4116-0063-a51e20d24e7e.png">

こんな感じの構成で作っていきます。

## dockernetworkの作成

dockerでは仮想networkを作成することができます。今回は以下のコマンドでfrontとbackの二つのネットワークを作成し、LBをfrontとbackにつなぎbackにwebサーバーを2台置きます。

```
docker network create --subnet=192.168.3.0/24 network_LB_front
docker network create --subnet=192.168.4.0/24 network_LB_back
```
## lbの作成
前述の通りlbにはnginxを使います。普通ならvm建ててnginx突っ込んでみたいなめんどくさいことをしなきゃいけませんが、dockerなら最初からnginx入りのコンテナが用意されてます。素敵ですね。
すでにimageを持っている方も多いとは思いますが、持っていない方は下の公式urlの方見てpullしておいてください。
https://hub.docker.com/_/nginx/
<br>
lbという名前のvmをホストpcの8080ポートのポートフォワーディングさせてrunしてます。ホスト側のポートは適宜好きなポートにしてください。

```
docker run -it --name lb -p 8080:80 --net=network_LB_front --ip=192.168.3.101 -d  nginx
```
続いてbackセグとの接続を行います。下記のコマンドでbackセグと接続してください。

```
docker network connect --ip 192.168.4.101 network_LB_back lb
```

ここでwebブラウザを使ってlocalhost:8080にアクセスし、下のようなページに遷移すれば正常です。

<img width="601" alt="スクリーンショット 2018-07-21 18.21.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/255246/a8251962-208c-0c28-4359-74c126553866.png">

## webserverの作成
アクセスの振り先であるwebserverを建てます。
一応切り戻して確認できるようにポートフォワーディングしていますが、なくても大丈夫といえば大丈夫です。

```
docker run -it --name l_server1 -p 8085:80 --net=network_LB_back --ip=192.168.4.102 -d  nginx
docker run -it --name l_server2 -p 8086:80 --net=network_LB_back --ip=192.168.4.103 -d  nginx

```

## LBの設定
#### コンテナへログイン
下記コマンドでログインします

```
docker exec -it lb bash
```
#### vimのインストール
まずnginx公式から落としてきたimageにはvimが入っていないので設定ファイルの編集ができません。なので`apt-get`しましょう。
また、curl等々したりしたくなることもあると思いますがそれらもないので適宜入れてください。pingに関してはpingそのものがないので代わりに iputils-ping入れてあげると良いですb

```
apt-get update
apt-get install vim
```

#### nginx.confの設定
ここからやっと本番の設定です。`/etc/nginx/nginx.conf`を編集していきます。+部分が追記場所で-が削除箇所です。やっていることはupstream proxy.comというスコープでアクセスの振り先を複数列挙し、locationの中でまとめて指定しています。
そして、conf.d配下の*.confを読み込んでいますが、ここに書かれている処理(初期状態だとdefault.conf)と競合するのでその行を消しています。

```
 user  nginx;
中略

http {
    中略
    #gzip  on;
    +upstream proxy.com{
    +   server 192.168.4.102;
    +   server 192.168.4.103;
    +}
    server {
        listen 80;
 
     +   location / {
     +      proxy_pass http://proxy.com;
     +  }
    }
    -  include /etc/nginx/conf.d/*.conf;
}

```
#### nginx の再起動
下記のコマンドで再起動をかけます。

```
nginx -s reload
```

## 処理の可視化
これで実装そのものは完了で、LBに着弾したアクセスがbackのネットワークにあるserver1,2に振り分けられるようになっています。ですが表示されるのはロードバランシング前と同じ*Welcome to nginx!*これではあまりに味気ないので、server1、2のhtmlファイルを書き換えて見ましょう。

まずserver1へログイン
```docker exec -it l_server1 bash```

vimがないのでvimをインスコ

```
apt-get update
apt-get install vim
```

htmlのある場所へ移動してvimで開く

```
cd /usr/share/nginx/html
vim index.html
```

あとはwellcome to nginx をwellcome to server1とかにしてあげれば...
<img width="614" alt="スクリーンショット 2018-07-21 18.53.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/255246/cebc7ff5-53a3-e607-4f60-8b26644e650e.png">