Edited at

docker v1.12のオーケストレーション機能をマルチホストで試すよ on さくらのクラウド

More than 3 years have passed since last update.

2016/6/20のDockerCon16でDocker v1.12の新機能たちが発表されました。

今回は新機能の中から目玉の一つ「オーケストレーション」機能を試してみました。

元ネタ:Swarm Modeチュートリアル

=====追記

今回は実験用であるため、セキュリティ面/パフォーマンス面など考慮していません。

実際に試す際は十分に注意ください。


=====追記ここまで

=====追記その2

2016年7月29日 Docker v1.12.0がGAとなりました。

それに伴い、DockerMachineのオプションに--engine-install-urlを指定する必要がなくなりました。

その他端々変更されている箇所がありますので、最新情報は公式マニュアルを参照してください。

=====追記ここまで


オーケストレーション機能とは

今回も神速で紹介ブログが和訳されていました(さすが!)。

引用:【参考訳】Docker 1.12: ついにオーケストレーションを組み込み!

swarm-mode.png

従来と比べると、etcdやconsulをインストールしなくても良いため

swarmクラスタの構築が楽になりましたね。

早速試してみます。


準備

以下ではMacで作業しています。

コマンド例などは各自の環境に応じて適宜読み替えてください。


手元のマシンにdocker v1.12をインストール

今回のDockerConに合わせ、Docker for Mac/Windowsがプライベートベータからパブリックベータとなりました。せっかくなので使ってみましょう。

Docker for Mac/Windowsは以下のサイトからダウンロードできます。

https://docs.docker.com


swarmクラスタ用マシンの準備


DockerMachine + さくらのクラウド

今回はさくらのクラウド上に3台マシンを作ります。

docker-machineのさくらのクラウド用ドライバを使いますのでこちらの記事などを参考に

インストールを行っておいてください。


マシン作成 + dockerインストール

以下コマンドでさくらのクラウド上にマシンを作ります。

--engine-install-urlを指定することで、正式リリース前のedgeバージョンの

dockerをインストールすることができます。


マシン作成

# 1台目

$ docker-machine create -d sakuracloud \
--sakuracloud-access-token=[ACCESS TOKEN] \
--sakuracloud-access-token-secret=[ACCESS TOKEN SECRET] \
--engine-install-url="https://experimental.docker.com" \
sakura01

# 2台目
$ docker-machine create -d sakuracloud \
--sakuracloud-access-token=[ACCESS TOKEN] \
--sakuracloud-access-token-secret=[ACCESS TOKEN SECRET] \
--engine-install-url="https://experimental.docker.com" \
sakura02

# 3台目
$ docker-machine create -d sakuracloud \
--sakuracloud-access-token=[ACCESS TOKEN] \
--sakuracloud-access-token-secret=[ACCESS TOKEN SECRET] \
--engine-install-url="https://experimental.docker.com" \
sakura03



クラスタ構築


1台目 init

早速クラスタ構築を行っていきましょう。

まずはクラスタの初期化を行います。初期化はswarm initコマンドとのことです。


swarm_init

$ docker swarm init --help

Usage: docker swarm init [OPTIONS]

Initialize a Swarm

Options:
--auto-accept value Auto acceptance policy (worker, manager, or none)
--force-new-cluster Force create a new cluster from current state.
--help Print usage
--listen-addr value Listen address (default 0.0.0.0:2377)
--secret string Set secret value needed to accept nodes into cluster


ではまず1台目のマシンでinitを実行してみましょう。


_swarm_init実行

# 1台目のマシンに接続

$ eval $(docker-machine env sakura01)

# init実施
$ docker swarm init
Swarm initialized: current node (bvotc0o2ukxbeud6jedhpyvsq) is now a manager.


本来は内部のネットワークでリッスンするように--listen-addrオプションをつけるべきですが、

今回は検証用ということでデフォルト値(0.0.0.0:2377)でリッスンしてます。

以下コマンドで確認できます。


swarm_init確認

$ docker node ls

ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS
bvotc0o2ukxbeud6jedhpyvsq * sakura01 Accepted Ready Active Leader



2,3台目 join

残り2台をクラスタに参加させましょう。

参加するには1台目のIPアドレス/ポートをオプションで指定します。

以下コマンドで1台目のIPアドレスを確認してから参加していきましょう。


IP確認

$ docker-machine ip sakura01


swarmクラスタへの参加はjoinコマンドを用います。


swarm_join

$ docker swarm join --help

Usage: docker swarm join [OPTIONS] HOST:PORT

Join a Swarm as a node and/or manager

Options:
--ca-hash string Hash of the Root Certificate Authority certificate used for trusted join
--help Print usage
--listen-addr value Listen address (default 0.0.0.0:2377)
--manager Try joining as a manager.
--secret string Secret for node acceptance


早速実行しましょう。


swarm_join実施

# 2台目のマシンへ接続

$ eval $(docker-machine env sakura02)

# join
$ docker swarm join `docker-machine ip sakura01`:2377
This node joined a Swarm as a worker.

# 3台目のマシンへ接続
$ eval $(docker-machine env sakura03)

# join
$ docker swarm join `docker-machine ip sakura01`:2377
This node joined a Swarm as a worker.

# 1台目に接続して確認
$ eval $(docker-machine env sakura01)
$ docker node ls
ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS
03qup39ksvhcgvusqk7o9x50h sakura03 Accepted Ready Active
bvotc0o2ukxbeud6jedhpyvsq * sakura01 Accepted Ready Active Leader
ccup7i31v4dbzip15ej49wpzm sakura02 Accepted Ready Active


これでクラスタ構築ができました。


クラスタ上でdockerコンテナ起動(serviceコマンド)

クラスタ上でのコンテナ起動にはserviceコマンドを利用します。


serviceコマンド

$ docker service --help

Usage: docker service COMMAND

Manage Docker services

Options:
--help Print usage

Commands:
create Create a new service
inspect Inspect a service
tasks List the tasks of a service
ls List services
rm Remove a service
scale Scale one or multiple services
update Update a service

Run 'docker service COMMAND --help' for more information on a command.


今回はNginxを起動してみます。サービス名としてhellosakuraと指定しています。

また、http用に80番ポートを指定しています。


service実行

$ docker service create --replicas 1 --name hellosakura -p 80:80 nginx:latest


確認はservice lsservice tasks [タスク名]というコマンドで行います。


確認

# サービス起動状況の確認

$ docker service ls
ID NAME REPLICAS IMAGE COMMAND
2685cua3k8wm hellosakura 1/1 nginx:latest

# サービス内の各タスクの起動状況の確認(sakura03で起動しているのが見える)
$ docker service tasks hellosakura
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
4zh6ppxmxncfm6guswtoixmho hellosakura.1 hellosakura nginx:latest Running 37 seconds Running sakura03



動作確認

それではブラウザなどで各マシンのIPにアクセスしてみましょう。


動作確認

$ open http://`docker-machine ip sakura01`

$ open http://`docker-machine ip sakura02`
$ open http://`docker-machine ip sakura03`

どのIPを指定してもNginxのページが表示されますよね?

Swarmクラスタ上では(クラスタ内の)どのIPであっても、公開ポートへのアクセスがあると、

Overlayネットワーク上で対象サービスポートへ到達できるようになっています。


残り

本日はとりあえずここまでです。

他にも


  • スケールアウト/スケールイン

  • クラスタ内コンテナのローリングアップデート

  • ノード除去時の再配置

など面白い機能が盛りだくさんです。

ぜひチュートリアルを実施してみてください。

以上です。