【Dockerの最新機能を使ってみよう】 Docker SwarmによるDockerクラスタ環境の構築



 新たなサーバー環境構築ツールとして普及が始まっているDockerは、その開発も積極的に行われている。そこで本連載記事では、4回に渡って最近Dockerに実装された新機能について紹介していく。今回は、Dockerが開発するDockerクラスタ管理・運用ツール「Docker Swarm」について紹介する。

Dockerを使ったクラスタ環境とは

 Dockerでは1つのアプリケーションを1つのコンテナに入れ、複数のコンテナを組み合わせてサービスを構築する、という手法が推奨されている。このような構成によって各アプリケーションを分離することで、セキュリティの強化や開発・運用の効率化が期待できる。また、コンテナはデプロイが容易であるため、同じコンテナを複数のマシン上で同時に実行させる負荷分散構成を取りやすいというメリットもある。

 Dockerを利用したクラスタ環境についてはDockerが登場した当初から議論されており、こういった環境を構築するためのソフトウェアは複数公開されている。代表的なものとしては以前紹介したKubernetesというツールがあるが、2015年11月にリリースされたDocker 1.9では、似たような機能を提供する「Docker Swarm」という機能が「production-ready」(製品として利用可能)になった。今回はこのDocker Swarmを使ったクラスタ環境構築について紹介していく。

Docker Swarmのアーキテクチャ

 Dockerではdockerコマンドでコンテナの起動や停止、そのほか各種管理操作を行うようになっている。この際、dockerコマンドはバックグランドで動作しているDocker Daemon(dockerサービス)をAPI経由で操作して各種操作を実行するようになっている(図1)。

図1 dockerコマンドはDocker Daemon経由でコンテナの操作を実行する
図1 dockerコマンドはDocker Daemon経由でコンテナの操作を実行する

 Dockerのデフォルト設定では、UNIXドメインソケット(通常は/var/run/docker.sock)経由でdockerコマンドとDocker Daemonのやり取りを行う仕組みになっているが、ネットワーク(TCP)経由でやり取りを行うことも可能だ。Docker Swarmではこれを利用し、「Swarm Manager」と呼ばれるソフトウェアが各ノードで動作するDocker Daemonを一括操作することで、クラスタ上でのコンテナ管理を実現している(図2)。

図2 Docker SwarmはAPI経由で各ノードのDocker Daemonを操作する
図2 Docker SwarmはAPI経由で各ノードのDocker Daemonを操作する

 また、Swarm ManagerはDocker Daemonと同じAPIを実装している。そのため、Swarm ManagerではローカルのDockerを利用するのとまったく同じdockerコマンドを使ってコンテナの起動や停止といった管理操作を実行できる。つまり、Dockerの知識があれば特に新たな知識を必要とせず、そのままクラスタの管理が行えるのだ。

Docker Swarmでできること・できないこと

 Docker Swarmではユーザーからのコンテナ作成要求に対し、Dockerクラスタを構成するノードから最適なノードを自動で選択してそこで要求されたコンテナを実行させることができる。また、各ノードで実行されているコンテナの状況を取得したり、コンテナの停止や再起動を行うことも可能だ。さらにノードが何らかのトラブルで停止した場合などに、停止したコンテナを別のノードで実行させる機能もある。

 いっぽう、コンテナ間のネットワーク的な接続やルーティングについてはDockerが備えている以上の機能は提供されない。また、コンテナイメージの管理についても、Docker Swarmが特別な機能を提供するわけではない。そのため各ノードで実行させるコンテナのイメージはDocker Hub、もしくは自前で用意したコンテナイメージリポジトリに配備し、かつそれぞれのノードからそこにアクセスできるよう設定しておく必要がある。

Docker Swarmのインストールと設定

 Docker Swarmを利用するためには、コンテナを動かすためのサーバーに加えて、Swarm Managerを実行させるサーバーが必要となる。また、ノードの管理情報などを格納するKey-Valueストアも必要だ。Key-Valueストアへのアクセスは「libkv」というライブラリを使って実現されており、現時点ではConsulおよびEtcdApache ZooKeeperが利用可能だ。

 以下ではKey-ValueストアとしてEtcdを利用し、次の3つのホストを使った構成でDocker Swarmを利用したDockerクラスタを構築する例を紹介していく。

  • ホスト1(fedora01):docker managerおよびEtcdを実行させるサーバー
  • ホスト2(fedora02):コンテナを実行させるサーバー1
  • ホスト3(fedora03):コンテナを実行させるサーバー2

 なお、各ホストのOSにはFedora 23を使用している。

Docker Swarmのインストール

 Docker SwarmはDockerと同様、GitHubでソースコードが公開されている(GitHubのdocker/swarmプロジェクト)。また、Dockerの公式リポジトリであるDockerHubではDocker Swarmのバイナリが含まれる公式コンテナイメージが公開されており(DockerHubのswarmリポジトリ)、DockerおよびDockerHubの利用が可能な環境であれば次のようにすることで容易にコンテナ内でDocker Swarmを実行できる。

# docker run -d swarm <swarmコマンドに与えるオプション>

 もちろん、ソースコードからDocker Swarmwをビルドして利用することも可能だ。ちなみにDocker SwarmはGo言語で実装されているため、その場合はGo言語の処理系およびライブラリ一式(記事執筆時点での最新版であるDocker Swarm 1.2.3をビルドするにはGo 1.5系以降)が必要となる。Fedora 23では標準でバージョン1.5.4のGo処理系およびライブラリが提供されており、そちらをそのまま利用できる。具体的なビルド手順は以下の通りだ。

 まず、ビルド用のディレクトリ(ここでは~/swarm_buildディレクトリ)を作成し、「GOPATH」環境変数にそのディレクトリのフルパス名を格納しておく。

$ mkdir ~/swarm_build
$ cd ~/swarm_build
$ export GOPATH=$(pwd)

 続いて、ビルド用ディレクトリ内のsrc/github.com/docker/swarmディレクトリにDocker Swarmのリポジトリをクローンし、ビルドしたいバージョンに対応するタグをチェックアウトする。今回はバージョン1.2.2(v1.2.2)というタグをチェックアウトした。

$ git clone https://github.com/docker/swarm src/github.com/docker/swarm
$ cd src/github.com/docker/swarm
$ git checkout -b v1.2.2 v1.2.2

 また、Docker SwarmではGo 1.5の実験的機能である「vendor」ディレクトリ内への依存ライブラリ配置機能を利用している(この機能はGo 1.6で正式版機能として利用可能になっている)。この機能を利用するため、「GO15VENDOREXPERIMENT」環境変数を1に設定しておく。

$ export GO15VENDOREXPERIMENT=1

 以上の設定が完了したら、「go install」コマンドを実行することでビルドを行える。

$ go install .

 ビルドが完了すると、ビルド用ディレクトリ(今回は~/swarm_buildディレクトリ)直下に作成されたbinディレクトリ内に「swarm」というバイナリが格納される。これを/usr/local/binディレクトリなどのパスが通っているディレクトリにコピーすればインストール完了だ。

# cp ~/swarm_build/bin/swarm /usr/local/bin

 与えられる引数などは、「–help」オプション付きでswarmコマンドを実行することで確認できる。

$ swarm --help
Usage: swarm [OPTIONS] COMMAND [arg...]

A Docker-native clustering system

Version: 1.2.2 (HEAD)

Options:
  --debug			debug mode [$DEBUG]
  --log-level, -l "info"	Log level (options: debug, info, warn, error, fatal, panic)
  --experimental		enable experimental features
  --help, -h			show help
  --version, -v			print the version
  
Commands:
  create, c	Create a cluster
  list, l	List nodes in a cluster
  manage, m	Manage a docker cluster
  join, j	Join a docker cluster
  help		Shows a list of commands or help for one command
  
Run 'swarm COMMAND --help' for more information on a command.

 Docker Swarmはコンテナを実行する各ノードにインストールしておく必要があるため、今回はこのようにしてビルドしたswarmファイルをそのまま各ノードの/usr/local/binディレクトリ以下にコピーした。Goで作成されたバイナリは依存するライブラリなどがすべて静的にリンクされるため、この単一ファイルをコピーするだけで同じアーキテクチャのほかのマシン上でも動作する。

Etcdの設定

 Etcdの設定については、各ホストからEtcdにアクセスできるようにしておくのみで、特にDocker Swarmに向けて固有のものはない。これについては「Dockerのマルチホストネットワークで複数ホスト間を繋ぐ仮想ネットワークを作る」記事内の「複数のDockerホストにまたがるネットワーク(マルチホストネットワーク)を利用するための設定」で紹介しているので、そちらを参照してほしい。