Docker Swarm のインストール

Docker コンテナのクラスタを、ホストとスケジュールするために Docker Swarm が使えます。このセクションでは Docker Swarm の紹介として、ローカルマシン上に Docker Machine と VirtualBox を使ってクラスタを作る方法を学びます。

動作条件

ローカルのシステムに VirtualBox がインストールされていることを確認します。Mac OS X や Windows であれば、Docker をインストール済みであれば VirtualBox もインストールされているでしょう。

自分のシステム・アーキテクチャに応じた指示に従い、 Docker Machine をインストール します。

Docker Swarm の作成

Docker Machine は Docker コンテナを実行可能なホストを作成します。Docker Swarm の各ノードは Docker にアクセスし、イメージの取得やコンテナを実行します。Docker Machine はクラスタ全体のプロビジョニングを管理します。

docker-machine で Swarm クラスタを作成する前に、ディスカバリ・サービスと各ノードを連携しておきます。この例では Docker Hub が提供するトークンによるディスカバリ・サービスを使います。ディスカバリ・サービスは、Docker デーモンを実行している各ノードのインスタンスを、トークンで関連づけるものです。他にも etcdconsulzookeeper といったディスカバリ・サービス・バックエンドが 利用できます

  1. システム上のマシン一覧を表示します。
$ docker-machine ls
NAME         ACTIVE   DRIVER       STATE     URL                         SWARM
docker-vm    *        virtualbox   Running   tcp://192.168.99.100:2376

この例では Mac OSX システム上に Docker Toolbox をインストールしました。そのため、 docker-vm 仮想マシンが表示されています。

  1. 自分のシステム上に local という名称の VirtualBox マシンを作成します。
$ docker-machine create -d virtualbox local
INFO[0000] Creating SSH key...
INFO[0000] Creating VirtualBox VM...
INFO[0005] Starting VirtualBox VM...
INFO[0005] Waiting for VM to start...
INFO[0050] "local" has been created and is now the active machine.
INFO[0050] To point your Docker client at it, run this in your shell: eval "$(docker-machine env local)"
  1. local マシンの設定をシェルに読み込みます。
$ eval "$(docker-machine env local)"
  1. Docker Swarm イメージを使い、ディスカバリ・トークンを生成します。

次のコマンドはコンテナ内で swarm create を実行します。もしローカルのマシン上に swarm:latest イメージが存在しなければ、Docker は Docker Hub からダウンロード(pull)します。

$ docker run swarm create
Unable to find image 'swarm:latest' locally
latest: Pulling from swarm
de939d6ed512: Pull complete
79195899a8a4: Pull complete
79ad4f2cc8e0: Pull complete
0db1696be81b: Pull complete
ae3b6728155e: Pull complete
57ec2f5f3e06: Pull complete
73504b2882a3: Already exists
swarm:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:aaaf6c18b8be01a75099cc554b4fb372b8ec677ae81764dcdf85470279a61d6f
Status: Downloaded newer image for swarm:latest
fe0cc96a72cf04dba8c1c4aa79536ec3

swarm create コマンドは fe0cc96a72cf04dba8c1c4aa79536ec3 のようなトークンを返します。

  1. トークンを安全な場所に保存します。

このトークンは次のステップで Docker Swarm を作成するときに使います。

Swarm マネージャの起動

Docker Swarm マネージャと呼ばれるネットワーク上のシステムがあります。Swarm マネージャは、オーケストレート(自動処理)とクラスタ内のコンテナのスケジュールをします。Swarm マネージャはエージェント(ノードや Docker ノードとも呼ばれます)の集団を統率します。

Swarm エージェントはコンテナのホスティングに対して責任を持ちます。これらは通常の Docker デーモンであり、Docker リモート API を使って通信可能です。

このセクションでは、Swarm マネージャと2つのノードを作成します。

  1. VirtualBox 配下で Swarm マネージャを作成します。
docker-machine create \
        -d virtualbox \
        --swarm \
        --swarm-master \
        --swarm-discovery token://<TOKEN-FROM-ABOVE> \
        swarm-master

実行例:

$ docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://fe0cc96a72cf04dba8c1c4aa79536ec3 swarm-master
INFO[0000] Creating SSH key...
INFO[0000] Creating VirtualBox VM...
INFO[0005] Starting VirtualBox VM...
INFO[0005] Waiting for VM to start...
INFO[0060] "swarm-master" has been created and is now the active machine.
INFO[0060] To point your Docker client at it, run this in your shell: eval "$(docker-machine env swarm-master)"
  1. VirtualBox マネージャを開き、 local マシンと新しい swarm-master マシンが作成されていることを確認します。
  1. Swarm ノードを作成します。
docker-machine create \
-d virtualbox \
--swarm \
--swarm-discovery token://<TOKEN-FROM-ABOVE> \
swarm-agent-00

実行例:

$ docker-machine create -d virtualbox --swarm --swarm-discovery token://fe0cc96a72cf04dba8c1c4aa79536ec3 swarm-agent-00
INFO[0000] Creating SSH key...
INFO[0000] Creating VirtualBox VM...
INFO[0005] Starting VirtualBox VM...
INFO[0006] Waiting for VM to start...
INFO[0066] "swarm-agent-00" has been created and is now the active machine.
INFO[0066] To point your Docker client at it, run this in your shell: eval "$(docker-machine env swarm-agent-00)"
  1. swarm-agent-01 という名前の別のエージェントを追加します。
$ docker-machine create -d virtualbox --swarm --swarm-discovery token://fe0cc96a72cf04dba8c1c4aa79536ec3 swarm-agent-01

VirtualBox マネージャ上に、2つのエージェントが表示されているでしょう。

Swarm を直接操作

このステップでは、Swarm マシンに接続し、Swarm クラスタに関連する情報を表示します。さらに Swarm 上でイメージを実行します。

  1. Docker環境を Swarm マスタが実行しているマシンに切り替えます。
$ eval $(docker-machine env --swarm swarm-master)
  1. docker コマンドを使って新しいクラスタの情報を取得します。
 $ docker info
 Containers: 4
 Strategy: spread
Filters: affinity, health, constraint, port, dependency
 Nodes: 3
  swarm-agent-00: 192.168.99.105:2376
     └ Containers: 1
     └ Reserved CPUs: 0 / 8
     └ Reserved Memory: 0 B / 1.023 GiB
  swarm-agent-01: 192.168.99.106:2376
     └ Containers: 1
     └ Reserved CPUs: 0 / 8
     └ Reserved Memory: 0 B / 1.023 GiB
  swarm-master: 192.168.99.104:2376
     └ Containers: 2
     └ Reserved CPUs: 0 / 8

各エージェントとマスタは、全てポート 2376 を開いているのが分かります。Swarm クラスタ作成時、ノード毎に任意のポート利用も可能です。各 Swarm ノードは、Swarm エージェントのコンテナを実行しています。

マスタは Swarm マネージャと Swarm エージェントの各コンテナを実行しています。プロダクション環境では、エージェントが停止すると問題が発生するためお薦めしません。しかしながら、このような学習環境においては十分です。

  1. Swarm 上で実行しているイメージを確認します。
$ docker ps  -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                     NAMES
78be991b58d1        swarm:latest        "/swarm join --addr    3 minutes ago       Up 2 minutes        2375/tcp                                  swarm-agent-01/swarm-agent
da5127e4f0f9        swarm:latest        "/swarm join --addr    6 minutes ago       Up 6 minutes        2375/tcp                                  swarm-agent-00/swarm-agent
ef395f316c59        swarm:latest        "/swarm join --addr    16 minutes ago      Up 16 minutes       2375/tcp                                  swarm-master/swarm-agent
45821ca5208e        swarm:latest        "/swarm manage --tls   16 minutes ago      Up 16 minutes       2375/tcp, 192.168.99.104:3376->3376/tcp   swarm-master/swarm-agent-master
  1. Docker の hello-world テストイメージを Swarm クラスタ上で実行します。
$ docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.


To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (Assuming it was not already locally available.)
 3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.


To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash


For more examples and ideas, visit:
 http://docs.docker.com/userguide/
  1. docker ps コマンドを使うと、どのノードでコンテナが実行中か分かります。
$ docker ps -a
 CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS                     PORTS                                     NAMES
54a8690043dd        hello-world:latest   "/hello"               22 seconds ago      Exited (0) 3 seconds ago                                             swarm-agent-00/modest_goodall
78be991b58d1        swarm:latest         "/swarm join --addr    5 minutes ago       Up 4 minutes               2375/tcp                                  swarm-agent-01/swarm-agent
da5127e4f0f9        swarm:latest         "/swarm join --addr    8 minutes ago       Up 8 minutes               2375/tcp                                  swarm-agent-00/swarm-agent
ef395f316c59        swarm:latest         "/swarm join --addr    18 minutes ago      Up 18 minutes              2375/tcp                                  swarm-master/swarm-agent
45821ca5208e        swarm:latest         "/swarm manage --tls   18 minutes ago      Up 18 minutes              2375/tcp, 192.168.99.104:3376->3376/tcp   swarm-master/swarm-agent-master

次はどちらへ

On this page:

これまで、 Docker Swarm を Docker Hub 上の最新イメージを取得して構築しました。それから VirtualBox を使ってローカルのマシン上に Swarm クラスタを構築しました。必要であれば、 Docker Swarm 機能の概要 をお読みください。あるいは、Swarm をより深く開発するためには、ネットワーク上で Swarm の手動インストール をお読みください。