はじめに
ネットワークの勉強するのに実機買ったりクラウドサービス使うのはお財布に優しくないのでとりあえずdockerで色々試していきたいと思います。今回は手始めにサーバー二つ建ててnginxでロードバランシングします。
前提条件
dockerがインストールされていること
macユーザーであること(この記事はmac環境で作業するので)
##構成図
想定としてインターネットからLBめがけて降ってきたアクセスをclosedなネットワークにおいてあるサーバー2台に着弾させてあげる感じです。(ほんとはLBの前にFWとかあると良いんですけどそれはまた別の記事でやります...)
こんな感じの構成で作っていきます。
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/
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にアクセスし、下のようなページに遷移すれば正常です。
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