前回はVagrantでdockerが使える環境の準備までを行いました
今回はdockerでHAProxyコンテナ1つとNginxコンテナを3つを立ち上げてロードバランサとして機能させようと思います
やりたいこと
本当はMySQLのロードバランサとしてHAProxyを使用したいのですがPHPも書かないといけないし、MySQLの設定もHAProxyもやったことがないので、まずは普通にWebサーバーのリバースプロキシサーバーとしての設定を書いてみます(Nginxで出来るけどMySQLのために今後HAProxyを使うのでこちらをプロキシサーバーにする)
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 です
手順として
コンテナ立ち上げ
Nginxインストール
index.html書き換え
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
<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
「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コンテナを立ち上げる
手順として
コンテナ立ち上げ
HAProxyインストール
haproxyコンフィグ書き換え
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」が変わるはずです
同じIPだけどweb2だったりweb3だったり変わっていますね
所感
複数コンテナの連携とHAProxyの設定の仕方が少しずつ分かってきたのは個人的に大きいです
次回はMySQLの振り分けを行いたいと思います
以上です