LoginSignup
10
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-01-25

前回はVagrantでdockerが使える環境の準備までを行いました

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

やりたいこと

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

とりあえず画像で説明
docker-haproxy-nginx.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

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

「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
welcome-nginx3.PNG

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

所感

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

以上です

参考

ロードバランサHAProxyを使う
CentOS6.xにてnginxの最新版をインストールする手順

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11