概要
前回 VirtualBox 上で docker swarm 環境を構築してみました
swarm にはコンテナホスト間で横断的にコンテナが通信するために overlay というネットワークドライバがあります
今回はこれを使用して異なるコンテナホスト上で動作させたコンテナ同士を通信させてみたいと思います
また今回は swarm の管理方式を token ではなく consul を使ってクラスタを管理してみたいと思います
環境
- macOS X 10.12.6
- docker 17.09.0-ce
- docker-machine 0.12.2
- VirtualBox 5.1.26 r117224 (Qt5.6.2)
consul ノードの作成
docker swarm を管理するために必須です
docker-machine create --driver virtualbox consul
eval "$(docker-machine env consul)"
docker run -d -p "8500:8500" -h "consul" progrium/consul -server -bootstrap
consul を動作させるためのコンテナホストを 1 台作成して、その上で consule をサーバとして動作させます
swarm クラスタにコンテナホストを作成する
2 台のコンテナホスト (master と通常ノード) をクラスタに登録します
swarm-master
docker-machine create --driver virtualbox --swarm --swarm-master --swarm-discovery="consul://$(docker-machine ip consul):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul):8500" --engine-opt="cluster-advertise=eth1:2376" swarm-master
node1
docker-machine create --driver virtualbox --swarm --swarm-discovery="consul://$(docker-machine ip consul):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul):8500" --engine-opt="cluster-advertise=eth1:2376" node1
docker-machine ls
eval $(docker-machine env --swarm swarm-master)
- docker info
で docker swarm クラスタの情報を確認できます
overlay ネットワークを作成する
コンテナホスト間で横断的に通信するための overlay ネットワークを作成します
docker network create --driver overlay --subnet=10.0.9.0/24 overlay-network
- docker network ls
305a0a49838a overlay-network overlay global
SCOPE が global な overlay ネットワークが作成されていることを確認します
コンテナを作成して動作確認
2 台作成したコンテナホスト上にそれぞれコンテナを作成して通信できるか確認します
swarm-master 上に nginx コンテナ (web) を起動
docker run -itd --name=web --net=overlay-network --env="constraint:node==swarm-master" nginx
node1 から swarm-master 上に作成した web コンテナにアクセスできるか確認
docker run -it --rm --net=overlay-network --env="constraint:node==node1" busybox wget -O- http://web
で結果的に以下のような HTML が取得できれば異なるコンテナホスト間で通信できていることになります
Connecting to web (10.0.9.2:80)
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
- 100% |*******************************| 612 0:00:00 ETA
ポイントは node1 上で起動している busybox のコンテナから web コンテナをコンテナ名で引けているところです
もし overlay ネットワークに所属していない状態でコンテナを起動すると web コンテナが見つからず以下のようにエラーとなります
docker run -it --rm --env="constraint:node==node1" busybox wget -O- http://web
wget: bad address 'web'
最後に
docker swarm 上で overlay ネットワークを作成して異なるコンテナホスト間でもコンテナ同士が通信できる環境を作成してみました
overlay ネットワークを構築する場合は token 方式ではなく consul 方式を使って docker swarm を管理したほうが無難です
Tips
swarm クラスタ内に存在するノードの確認
docker run swarm list consul://$(docker-machine ip consul):8500
docker-machine を使ってノードを新規で追加することもできますが swarm join コマンドを使って既存のコンテナホストを追加することもできます
0 件のコメント:
コメントを投稿