VirtualBox+Vagrant+Docker+HAProxy+MySQLでMySQLロードバランシングを実現する #2 HAProxy+Nginx編

[前回](http://qiita.com/TakashiOshikawa/items/606d2113000784505e41 "VirtualBox+Vagrant+Docker+HAProxy+MySQLでMySQLレプリケーションを実現する")はVagrantでdockerが使える環境の準備までを行いました

今回はdockerでHAProxyコンテナ1つとNginxコンテナを3つを立ち上げてロードバランサとして機能させようと思います



#やりたいこと
本当はMySQLのロードバランサとしてHAProxyを使用したいのですがPHPも書かないといけないし、MySQLの設定もHAProxyもやったことがないので、まずは普通にWebサーバーのリバースプロキシサーバーとしての設定を書いてみます(Nginxで出来るけどMySQLのために今後HAProxyを使うのでこちらをプロキシサーバーにする)

とりあえず画像で説明
![docker-haproxy-nginx.png](https://qiita-image-store.s3.amazonaws.com/0/36871/c35ac297-02c2-26bf-d521-0f5c3b7cd603.png)

Vagrantで立ち上げるVirtualBox(CentOS)のIP: 192.168.33.12
HAProxy(haproxy)にアクセスするためのポート: 80
Nginx(web1)にアクセスするためのポート: 8081
Nginx(web2)にアクセスするためのポート: 8082
Nginx(web3)にアクセスするためのポート: 8083


hostOSのブラウザでCentOSVMのIPを叩くと、haproxyコンテナにリクエストされ設定したwebサーバー群にリクエストが振り分けられます

リクエストが振り分けられているのを確認するのは、ブラウザ側の「web番号」で確認します
web1コンテナのNginxにリクエストがいった場合は「web1」
web3コンテナのNginxにリクエストがいった場合は「web3」と返すように設定します


ではやっていきましょう


#Nginxコンテナを3つ立ち上げる

今回は全てこちらのイメージを使うので落とします

dockerコマンドをそのまま打つと

```
[vagrant@localhost ~]$ docker pull takashioshikawa/centos6base
Post http:///var/run/docker.sock/v1.19/images/create?fromImage=takashioshikawa%2Fcentos6base%3Alatest: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
```
権限が無いと言われるので
今回はsudo -sでroot権限を持つようにしておきます

`sudo -s`
それから
`docker pull takashioshikawa/centos6base`
落とした結果


```
[root@localhost vagrant]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
takashioshikawa/centos6base   latest              63353774ba3c        2 weeks ago         636.5 MB
```



##Nginxコンテナ1を使えるように設定
コンテナ名は web1 です

手順として
コンテナ立ち上げ
:arrow_down: 
Nginxインストール
:arrow_down:
index.html書き換え
:arrow_down:
Nginxスタート

コマンドでまとめると
1. `docker run -it -d -p 8081:80 --name web1 takashioshikawa/centos6base`
2. `docker attach web1`
3. `wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm`
4. `rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm`
5. `yum -y install nginx`
6. `vim /usr/share/nginx/html/index.html`
7. `/etc/init.d/nginx start`
になります


###コンテナ立ち上げ
`docker run -it -d -p 8081:80 --name web1 takashioshikawa/centos6base`

```
[root@localhost vagrant]# docker run -it -d -p 8081:80 --name web1 takashioshikawa/centos6base
dd5187527369304ab920a51592569fe6f2bcd4964d3a3d1b089b51dca4335d45
[root@localhost vagrant]# docker ps
CONTAINER ID        IMAGE                         COMMAND                CREATED              STATUS              PORTS                  NAMES
dd5187527369        takashioshikawa/centos6base   "/bin/sh -c /bin/bas   About a minute ago   Up 1 seconds        0.0.0.0:8081->80/tcp   web1
```

動作しているのを確認


###web1コンテナに接続
`docker attach web1`

```
[root@localhost vagrant]# docker attach web1
[root@dd5187527369 /]#
```

CentOSのコンソールになっている事が確認できます


###Nginxをインストール

以下のコマンドを実行
`wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm`
`rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm`
`yum install -y nginx`

特に問題なければ
`which nginx`でパスが表示されれば大丈夫です

```
[root@dd5187527369 /]# which nginx
/usr/sbin/nginx
```


###index.htmlを編集

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


```html:index.html
<p><em>Thank you for using nginx.</em></p>
<!-- の下にweb1という文字を追加 -->
<h2>web1</h2>
```

###Nginxを起動

`/etc/init.d/nginx start`

起動したらブラウザで確認しましょう
`vagrantのIP:web1のport`にアクセス
`192.168.33.12:8081`
![welcome-nginx1.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/3a214966-89fb-f952-1296-ab25c18d8d08.png)

「Web1」という表示が見えているのでweb1コンテナのNginxが動いている事は確認出来ました


続けて
web2コンテナ、web3コンテナを立ち上げて
`docker run -it -d -p 8082:80 --name web2 takashioshikawa/centos6base`
`192.168.33.12:8082`ブラウザ確認
「web2」

`docker run -it -d -p 8083:80 --name web3 takashioshikawa/centos6base`
`192.168.33.12:8083`ブラウザ確認
「web3」


が確認出来るようにしてください




#HAProxyコンテナを立ち上げる

手順として
コンテナ立ち上げ
:arrow_down: 
HAProxyインストール
:arrow_down:
haproxyコンフィグ書き換え
:arrow_down:
HAProxyスタート

コマンドでまとめると
1. `docker run -it -p 80:8080 --link web1:web1 --link web2:web2 --link web3:web3 --name haproxy takashioshikawa/centos6base`
2. `yum install -y haproxy`
3. `vim /etc/haproxy/haproxy.cfg`
4. `/etc/init.d/haproxy start`
になります



###コンテナ立ち上げ
`docker run -it -p 80:8080 --link web1:web1 --link web2:web2 --link web3:web3 --name haproxy takashioshikawa/centos6base`

--linkでNginxコンテナと連携できるように設定します

###HAProxyインストール
`yum install -y haproxy`


###haproxyの設定
`vim /etc/haproxy/haproxy.cfg`

リクエストを受け入れるポートを5000から8080に変更
振り分け先にコンテナ名を指定するのがポイント

```
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:8080 #ここを8080に変更
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js

    use_backend static          if url_static
    default_backend             app

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
    balance     roundrobin
    server  app1 web1:80 check #ここにwebコンテナを指定 ポートは80
    server  app2 web2:80 check #ここにwebコンテナを指定 ポートは80
    server  app3 web3:80 check #ここにwebコンテナを指定 ポートは80

```


###HAProxyスタート

`/etc/init.d/haproxy start`




ではhaproxyにアクセスするようにブラウザで確認しましょう

haproxyのポートは80なので
192.168.33.12にアクセスすればリロードするごとに「web1」「web2」「web3」が変わるはずです


こんな感じ
![welcome-nginx2.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/77916211-9983-f56d-6db2-73b37892a6e3.png)
![welcome-nginx3.PNG](https://qiita-image-store.s3.amazonaws.com/0/36871/995c0812-680d-5ecf-7d2f-fd49a96f0e41.png)

同じIPだけどweb2だったりweb3だったり変わっていますね



#所感
複数コンテナの連携とHAProxyの設定の仕方が少しずつ分かってきたのは個人的に大きいです
次回はMySQLの振り分けを行いたいと思います

以上です




#参考
[ロードバランサHAProxyを使う](http://koexuka.blogspot.jp/2013/11/l7haproxy.html "ロードバランサHAProxyを使う")
[CentOS6.xにてnginxの最新版をインストールする手順](http://qiita.com/utano320/items/0c0d9b84a9a28525bcb9 "CentOS6.xにてnginxの最新版をインストールする手順")