2017年10月7日土曜日

docker swarm + overlay network 環境を構築してみた

概要

前回 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 件のコメント:

コメントを投稿