Tech Sketch Bucket of Technical Chips by TIS Inc.

CentOS 7.2+docker 1.11でdocker networkを使ってみた

Pocket

Docker 1.9がリリースされた時点でのdocker networkの公式ガイドでは、Kernel 3.16以上が必要との記述があったのだが、CentOSのKernelは最新の機能がバックポートされており、docker networkも動作するとの情報を頂いた。
確かに、現在のdocker公式のoverlay networkのガイドを参照すると、この記述が無くなっており、ディストリビュータ側の対応でKernelの制限が解除されたのでは?と考え検証してみることとした。

docker networkの概要については以下の記事も参考にして頂きたい。
Think IT/Docker1.9のマルチホストネットワーク

今回使用した環境は以下となる。

CentOS 7.2のサーバを3台準備し、それぞれにdockerの最新バージョンをインストールする。 docker swarmでクラスタ構成とし、1台をdocker swarmのmaster件nodeに、残り2台をnodeに構成している。

CentOS 7.2のvxlanのバックポート対応の確認

docker swarmのoverlay networkはvxlanを使用し、swarmクラスタで構成されたサーバ内のコンテナ間の通信を可能としている。 本来、vxlanの機能はLinux Kernel 3.12からの実装のはずだが、Redhat系のLinuxはそれ以前のKernelバージョンのOSに対してもバックポート対応として機能を提供している。CentOS 7系だけではなく、CentOS 6.5からバックポート対応としてリリースされている。

vxlanについては以下の記事が非常に参考になる。
ご参考「@IT:VXLAN(RFC7348)を学ぶ」

vxlanがサポートされていることは、以下のコマンドで確認できる。

$ sudo ip link help

出力の最後のTYPEにvxlanが含まれており、vxlanが使用可能であることがわかる。

dockerのインストールとswarmクラスタの構成

最新版のdockerのインストール

1.dockerのインストール
以下のコマンドを実行し、最新版のdocker engineをインストールする。
2016/6現在の最新バージョンは Docker version 1.11.2, build b9f10c9 である。
$ sudo curl -sSL https://get.docker.com/ | sh

2.dockerのサービスの起動と自動起動の設定
$ sudo systemctl start docker
sudo systemctl enable docker

swarmクラスタを使用する為の設定

1.docker deamonの起動オプションの設定
ExecStartの行を以下の形に書き換える。
$ sudo vi /etc/systemd/system/multi-user.target.wants/docker.service

2.firewallの設定
docker swarm managerおよび各nodeの接続を行うポートのfirewall設定の許可設定を行う。
docker swarmのネットワーク接続は以下の構成になる。

(1)manager側の設定
$ sudo firewall-cmd --add-port=8500/tcp --zone=public --permanent
$ sudo firewall-cmd --add-port=2376/tcp --zone=public --permanent
$ sudo firewall-cmd --add-port=4789/udp --zone=public --permanent
$ sudo firewall-cmd --add-port=7946/udp --zone=public --permanent
$ sudo firewall-cmd --add-port=7946/tcp --zone=public --permanent
$ sudo firewall-cmd --add-port=2375/tcp --zone=public --permanent
$ sudo firewall-cmd --reload

(2)node側の設定
$ sudo firewall-cmd --add-port=4789/udp --zone=public --permanent
$ sudo firewall-cmd --add-port=7946/udp --zone=public --permanent
$ sudo firewall-cmd --add-port=7946/tcp --zone=public --permanent
$ sudo firewall-cmd --add-port=2375/tcp --zone=public --permanent
$ sudo firewall-cmd --reload

3.dockerサービスの起動スクリプトのreloadとサービスの再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

以上でdockerのインストールとdocker swarmを使用する為の初期設定が完了である。

docker swarmクラスタの構成

master側の作業

1.consulコンテナの起動
docker swarmの各種情報を保存するKVS(Key Value Store)としてconsulを使用する。
consulの起動にはconsulがインストール済のコンテナを利用する。
$ sudo docker run -d -p 8500:8500 --name consul01 -h consul01 progrium/consul -server -bootstrap

2.swarm managerの起動
swarm managerを起動する。manager兼nodeとして利用する為、外部アクセスポートを2375から2376に変更している。
$ sudo docker run -d -p 2376:2375 --name manager swarm manage consul://10.255.202.97:8500/my_cluster

3.swarm nodeの登録
各サーバのswarm nodeとして登録する。今回は全てmanagerで起動したが、どのnodeでも起動できる。起動したコンテナは起動した追加されたnode上ではなく、起動したサーバ上で動作する。
$ sudo docker run --name tissvv095 -d swarm join --addr=10.255.202.95:2375 consul://10.255.202.97:8500/my_cluster
$ sudo docker run --name tissvv096 -d swarm join --addr=10.255.202.96:2375 consul://10.255.202.97:8500/my_cluster
$ sudo docker run --name tissvv097 -d swarm join --addr=10.255.202.97:2375 consul://10.255.202.97:8500/my_cluster

4.consulへのnode情報の登録の確認
以下のコマンドで、各nodeがconsul上のKVSに登録されたかの確認が行える。
$ sudo docker run --rm swarm list consul://10.255.202.97:8500/my_cluster

5.nodeの詳細情報の確認
以下のコマンドでdocker swarmでクラスタに構成された各nodeの詳細情報が確認できる。
$ sudo docker -H tcp://10.255.202.97:2376 info

overlay networkを作成と接続確認

1.overlay networkを作成
$ sudo docker -H tcp://10.255.202.97:2376 network create --driver overlay --subnet=10.0.9.0/24 my_network

2.overlay networkの作成結果を確認
以下のコマンドで作成したoverlay networkが存在することを確認する。
$ sudo docker -H tcp://10.255.202.97:2376 network ls

3.dockerコンテナを2個起動
以下のコマンドを実行し、ubuntu14_04のコンテナを2個作成する。
$ sudo docker -H tcp://10.255.202.97:2376 run -itd --name=c01 --hostname=c01 ubuntu:14.04
$ sudo docker -H tcp://10.255.202.97:2376 run -itd --name=c02 --hostname=c02 ubuntu:14.04

4.dockerコンテナの起動を確認
作成したコンテナがnodeに振り分けられて起動していることが確認できる。
$ sudo docker -H tcp://10.255.202.97:2376 ps

5.dockerコンテナにoverlay networkを接続
作成した2個のコンテナにoverlay networkを接続する。overlay networkを接続する場合、コンテナ内では新たなNICが接続された状態となる。
$ sudo docker -H tcp://10.255.202.97:2376 network connect my_network c01
$ sudo docker -H tcp://10.255.202.97:2376 network connect my_network c02

6.overlay networkの接続確認
以下のコマンドでoverlay networkへのコンテナの接続状況が確認できる。
$ sudo docker network inspect my_network

7.コンテナ間の通信確認
コンテナに接続し、コンテナ間でpingを実行することで通信の確認を行う。
ホストの指定は名前解決が行われているため、IPアドレス以外にホスト名でも指定できる。
$ docker -H tcp://10.255.202.97:2376 attach c01 root@c01:/# ping -c 4 c02

以上で構築と検証が完了となる。

エンジニア採用中!私たちと一緒に働いてみませんか?