複数台のサーバーにDockerがインストールされている場合、通常はそれぞれのサーバーごとにDockerコンテナを配置して利用すると思います。
サーバーが異なるDockerコンテナ間で通信を行う場合は、サーバーのIPアドレスやポートの設定を行うなどいろいろ工夫してDockerコンテナ同士を接続させているのではないでしょうか。
そんなときはぜひDockerのマルチホストネットワークを利用することをおすすめします。
マルチホストネットワーク機能は、仮想ネットワークを使うことによって複数の物理サーバーを自由に束ねることができます。
別々のサーバー上にあるDockerコンテナを同じDockerネットワークに接続させることが可能です。
本記事では、Dockerのマルチホストネットワークの概要について解説しております。また、そのあとでシンプルな環境の構築方法についても解説しております。
マルチホスト間でのDockerネットワークの構成
Dockerには、異なるDockerホスト上のコンテナを同じDockerネットワークに参加させるための機能があります。
つまり、Dockerネットワークを使ったのマルチホストネットワークを実現できます。
マルチホストネットワークの実現方法は色々ありますが、本記事では一番シンプルな以下のような構成について解説します。
図中の「overlay」部分が、マルチホストネットワークを実現するための仮想ネットワークインターフェイスです。
キーバリューストアサーバーには、マルチホストネットワーク環境で必要な情報(ネットワーク名や対象コンテナなど)が格納されていまして、各リソース情報をネットワークに参加するDockerコンテナ間で共有する役割を担っています。
キーバリューストアサーバーのホスト名は、Dockerデーモンに設定します。同じマルチホストネットワークに参加させたいDockerコンテナが存在するDockerホストには、同じキーバリューストアサーバーを定義する必要があります。
Dockerコンテナ(仮想nicを含む)や物理nicに関しては、マルチホストネットワークを意識する必要はありません。
結局のところ、単一Dockerホスト内のネットワーク環境とマルチホストネットワーク環境の構成上の違いは、仮想ネットワークであるoverlayの部分とキーバリューストアサーバーの部分だけということがお分かりいただけると思います。
DockerコンテナやDockerホストのネットワークインターフェイスなどには、構成上の変更は必要ありません。
マルチホスト間でのDockerネットワーク環境の構築
では、実際にマルチホストネットワーク環境を構築したいと思います。
構築する環境は以下のとおりです。
マルチホストネットワークoverlay01を作成し、Dockerホスト1上のコンテナvmtest1とDockerホスト2上のコンテナvmtest2を参加させます。
検証環境で使用する各マシンは以下のとおりです。
Docker公式ドキュメントによりますと、マルチホストネットワークの前提条件として、DockerホストのOSのカーネルバージョンが3.16以上と記載されてました。
DockerホストのOSにはUbuntuを利用します。
- Dockerホスト1
OS | Ubuntu 14.04 |
---|---|
kernel | 4.4.0-31 |
Docker | 1.13.1 |
IPアドレス | 192.168.1.1 |
コンテナ | vmtest1 |
仮想ネットワーク | overlay01 |
- Dockerホスト2
OS | Ubuntu 16.04 |
---|---|
kernel | 4.4.0-75 |
Docker | 1.13.1 |
IPアドレス | 192.168.1.2 |
コンテナ | vmtest2 |
仮想ネットワーク | overlay01 |
- キーバリューストアサーバー
OS | Ubuntu 17.04 |
---|---|
kernel | 4.10.0-19 |
Docker | 1.13.1 |
IPアドレス | 192.168.1.3 |
キーバリューストアサーバーの構築
まずキーバリューストアサーバーから作っていきます。
※キーバリューストアサーバーとは、キーと値の組を登録して、 キーを指定し値を読みだすことができるデータベース管理サーバーのことを指します
Docker公式ドキュメントによりますと、キーバリューストアはConsul、Etcd、Zookeeperのいずれか、と記載されてました。
今回は、公式ドキュメント内の構築例でも使用してますConsulを利用します。
Consulは、公式ドキュメントと同様にDockerHubからConsulイメージを使用しました。
キーバリューストアサーバーにDockerをインストールしまして、以下のコマンドでコンテナを起動します。
$ docker run -d -p 8500:8500 -h consul progrium/consul -server -bootstrap
起動されているか確認します。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc76971448e9 progrium/consul "/bin/start -serve..." 4 seconds ago Up 3 seconds 53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp dazzling_johnson
これでキーバリューストアサーバーの準備は完了です。
Dockerホスト1の構築
※本項の作業は管理者権限で行う必要があります
Dockerの最新版をインストールします。
次に、Dockerデーモンにキーバリューストアサーバーの設定を行います。
今回のサンプル環境では、Dockerホスト1と2のOSを異なるバージョン(Ubuntuの14.04と16.04)にしました。マルチホストネットワーク環境を構築する際、Dockerデーモンのオプション設定を行う必要があるのですが、その設定方法がUbuntuの14.04と16.04で異なるので、2つとも試したかったからです。
まず最初に構築するDockerホスト1のOSは、Ubuntu14.04です。
このバージョンは、OSのサービス管理機能にrcスクリプトを使用してます。この場合、Dockerデーモンのパラメータは、/etc/default/dockerファイルに設定します。
viなどのテキストエディタで/etc/default/dockerファイルを開きまして、その最下行に以下を記述して下さい。
DOCKER_OPTS="--cluster-store=consul://192.168.1.3:8500 --cluster-advertise=eth0:2376"
IPアドレス「192.168.1.3」はキーバリューストアサーバーのIPアドレスになります。eth0はDockerホスト1のネットワークインターフェイス名を設定して下さい。
設定が終わりましたら、以下のコマンドでDockerサービスを再起動します。
※現在起動中のコンテナは停止してしまいますのでご注意ください。
# service docker restart
以下の内容が表示されましたら正常に再起動が完了しています。(1672の部分はDockerデーモンのプロセスIDですので環境によって異なります)
docker stop/waiting
docker start/running, process 1672
Dockerホスト2の構築
※本項の作業は管理者権限で行う必要があります
次に構築するDockerホスト2のOSは、Ubuntu16.04です。
Dockerホスト1と同様にDockerの最新版をインストールします。
このバージョンは、OSのサービス管理機能にsystemdを使用してます。この場合、Dockerデーモンのパラメータは、/lib/systemd/system/docker.serviceファイルに設定します。
viなどのテキストエディタにて/lib/systemd/system/docker.serviceファイルを開きまして、以下の部分を見つけます。
(省略)
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd://
(省略)
「ExecStart=/usr/bin/dockerd -H fd://」の後に以下の内容を記述します。
--cluster-store=consul://192.168.1.3:8500 --cluster-advertise=eth0:2376
IPアドレス「192.168.1.3」はキーバリューストアサーバーのIPアドレスを設定します。また、eth0はDockerホスト2のネットワークインターフェイス名を設定して下さい。
記述後は、以下のとおりになります。
ExecStart=/usr/bin/dockerd -H fd:// --cluster-store=consul://192.168.1.3:8500 --cluster-advertise=eth0:2376
定義が終わりましたら、以下のコマンドを実行して、Dockerサービスの再起動を行います。
# systemctl daemon-reload
# systemctl restart docker
最後に、以下のコマンドでDockerサービスの状態を確認します。
# systemctl status docker
以下のように、出力内容の3行目に「active (running)」が表示されていれば大丈夫です。
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: e
Active: active (running) since 月 2017-03-06 16:09:15 JST; 29s ago
(以下省略)
まとめ
今まで単一のDockerホストで動いていたコンテナを、マルチホスト環境に移行する場合には、移行先のDockerホスト上でマルチホストネットワークを作成して、今まで動いていたコンテナを移行先でマルチネットワークに参加させて再実行すれば完了です。
但し、IPアドレスなどは変わってしまいますので、Dockerコンテナ内にハードコードしている場合は大変な作業になってしまいますが、そうでなければシンプルに移行作業が行えると思います。
今回作成したマルチホストネットワークを利用して実際にDockerコンテナを動かしてみた内容を記事「Dockerのマルチホストネットワーク機能を試してみた」にまとめました。
合わせてご利用ください。
最後までお読みいただきありがとうございました。
コメント