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 デーモンを実行している各ノードのインスタンスを、トークンで関連づけるものです。他にも etcd
、 consul
、 zookeeper
といったディスカバリ・サービス・バックエンドが 利用できます 。
- システム上のマシン一覧を表示します。
$ 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
仮想マシンが表示されています。
- 自分のシステム上に
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)"
local
マシンの設定をシェルに読み込みます。
$ eval "$(docker-machine env local)"
- 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
のようなトークンを返します。
- トークンを安全な場所に保存します。
このトークンは次のステップで Docker Swarm を作成するときに使います。
Swarm マネージャの起動¶
Docker Swarm マネージャと呼ばれるネットワーク上のシステムがあります。Swarm マネージャは、オーケストレート(自動処理)とクラスタ内のコンテナのスケジュールをします。Swarm マネージャはエージェント(ノードや Docker ノードとも呼ばれます)の集団を統率します。
Swarm エージェントはコンテナのホスティングに対して責任を持ちます。これらは通常の Docker デーモンであり、Docker リモート API を使って通信可能です。
このセクションでは、Swarm マネージャと2つのノードを作成します。
- 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)"
- VirtualBox マネージャを開き、
local
マシンと新しいswarm-master
マシンが作成されていることを確認します。
- 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)"
swarm-agent-01
という名前の別のエージェントを追加します。
$ docker-machine create -d virtualbox --swarm --swarm-discovery token://fe0cc96a72cf04dba8c1c4aa79536ec3 swarm-agent-01
VirtualBox マネージャ上に、2つのエージェントが表示されているでしょう。
Swarm を直接操作¶
このステップでは、Swarm マシンに接続し、Swarm クラスタに関連する情報を表示します。さらに Swarm 上でイメージを実行します。
- Docker環境を Swarm マスタが実行しているマシンに切り替えます。
$ eval $(docker-machine env --swarm swarm-master)
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 エージェントの各コンテナを実行しています。プロダクション環境では、エージェントが停止すると問題が発生するためお薦めしません。しかしながら、このような学習環境においては十分です。
- 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
- 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/
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 の手動インストール をお読みください。