Swarms in Docker Cloud (Beta) を試してみた

Swarms in Docker Cloud (Beta) というサービスについて、Google 検索しても日本語の記事が見当たらなかったため、本記事を書きました。

はじめに

以下の記事にて、Docker Cloud の Swarm Mode について一部触れていました。

その記事中に、Swarm Mode with Fleet Management and Collaboration now in public beta, powered by Docker Cloud - Docker Blog という記事へのリンクがあり、そこには個人やチームが Docker Cloud を利用して Docker for AWS や Docker for Azure にデプロイされた Docker Swarm(Docker Cluster)に対し、Docker ID を利用することで安全にアクセス出来るという Swarms in Docker Cloud の紹介がありました。そこで現状ベータ版のサービスではありますが、試してみることにしました。

検証環境について

筆者の環境は、以下のとおりです。

  • macOS Sierra version 10.12.5(16F73)
  • Docker for Mac Version 17.06.0-ce-mac18 (18433) Channel: stable
 ~ $ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.12.5
BuildVersion:   16F73
 ~ $ docker version
Client:
 Version:      17.06.0-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:31:53 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.06.0-ce
 API version:  1.30 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:51:55 2017
 OS/Arch:      linux/amd64
 Experimental: true
 ~ $ 

事前作業

予め、Docker for AWS 環境を構築していることを前提に記事を進めます。 Docker for AWS 環境の構築方法については、以下の記事を参照してください。

- Docker for AWS を試してみた | Developers.IO

また、Docker for AWS 環境の構築とは別に Docker Cloud を利用するために予め Docker ID を作成しておく必要があります。Docker ID を作成するには、以下のリンク先へアクセスしてください。

Docker for AWS 環境の構築作業時、CloudFormation のスタック作成処理で10分程度要するので その時間を利用して、Docker ID を作成して頂ければ良いかと思われます。

Docker Cloud での Swarm mode 設定作業

まず始めに、docker cloud へアクセスし Swarm mode のスイッチを ON にします。

Docker Cloud1

詳細については、下記ドキュメントを参照願います。

Docker Cloud に Swarm を登録する

次に、既存の Swarm を Docker Cloud に登録します。 前提条件として、以下を満たしておく必要があります。

  • swarm manager node(のいずれか1つ)に対して、端末セッションが接続されていること
  • swarm manager node の Port#2376 INBOUND 接続が許可されていること

メニューから Swarms BETA をクリックします。

Docker Cloud2

次に、Bring your own swarm をクリックしてください。

Docker Cloud3

ブラウザに、以下のウィンドウが表示されます。

Docker Cloud4

swarm manager node へ SSH 接続したターミナル(つまり、EC2 インスタンス)から、以下のコマンドを実行します。

$ docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock dockercloud/registration

Docker イメージを PULL した後、Docker ID のログイン認証が発生しますので Docker ID のユーザ名とパスワードを入力してください。また、「Enter name for the new cluster」 クラスタ名の入力を求められた際は、初期設定値ではなく例えば shimoda/aws のように分かり易い表記に設定することをオススメします。

下記は、実行例です。

 ~ $ docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock dockercloud/registration
Unable to find image 'dockercloud/registration:latest' locally
latest: Pulling from dockercloud/registration
486a8e636d62: Pull complete 
af5c6e97aa7e: Pull complete 
a2fa9dd1e6fe: Pull complete 
Digest: sha256:edfd454745e790041df692fc9bf46b4f968433dea7e968207718ba1be3d96766
Status: Downloaded newer image for dockercloud/registration:latest
Use your Docker ID credentials to authenticate:
Username: shimoda
Password: 

Available namespaces:
* shimoda
Enter name for the new cluster [shimoda/1l0z24bk5sfkoq8mctdext2wf]: 
You can now access this cluster using the following command in any Docker Engine:
    docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST dockercloud/client shimoda/1l0z24bk5sfkoq8mctdext2wf

登録作業が完了すると、ウィンドウが以下のように遷移します。

Docker Cloud5

close window をクリックしてください。

Docker Cloud6

Docker Cloud への登録作業は完了です。

詳細については、下記ドキュメントを参照願います。

macOS 側で dockercloud/client-proxy コンテナを起動する

swarm node 上で、dockercloud/registration コンテナを起動した際のメッセージに従い、macOS 側のローカル端末で docker run を実行し client-proxy コンテナを起動します。 なお、Docker Cloud へ Swarm を登録した際、自動的に dockercloud/server-proxy コンテナが起動しているため、server-proxy の起動作業は不要です。

~ $ docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST dockercloud/client shimoda/j0j9nnqocsd4yesa5mvpcfeou
Unable to find image 'dockercloud/client:latest' locally
latest: Pulling from dockercloud/client
486a8e636d62: Already exists 
354421f43c04: Pull complete 
a8dd6a7118b2: Pull complete 
19aaa36bba7a: Pull complete 
Digest: sha256:ba800f23e3bcb24f1a3b54cf800c3ce0f382850bf23065e4f81fbed8aca24ce0
Status: Downloaded newer image for dockercloud/client:latest
Use your Docker ID credentials to authenticate:
Username: shimoda
Password: 

=> You can now start using the swarm shimoda/j0j9nnqocsd4yesa5mvpcfeou by executing:
    export DOCKER_HOST=tcp://127.0.0.1:32768

これで準備が整いました。

Docker Cloud を介して Swarm に接続する

Docker for Mac を使用して、Swarm に接続したいと思います。

macOS メニューバーにある Docker アイコンをクリックします。

スクリーンショット 2017-07-06 19.27.51

次に、Sign in / Create Docker ID をクリックし Docker Cloud へログインします。 なお、Sign in / Create Docker ID がメニューに存在しない場合は、Check for Updates... から Docker for Mac のアップデートを実行してください。

スクリーンショット 2017-07-06 17.46.20

Docker Cloud へのログイン後、Swarms から登録された AWS 上の Swarm がリストされます。

スクリーンショット 2017-07-07 9.50.13

Swarm をクリックすると、macOS 側のターミナルが新規で立ち上がります。 この端末は、既に AWS 上の Swarm に接続された(macOS 上の client-proxy コンテナを通じて、AWS 上の Swarm manager node へ接続された)状態で起動しています。 では、確認してみましょう。

[aws] ~ $ docker node ls
ID                            HOSTNAME                                          STATUS              AVAILABILITY        MANAGER STATUS
p07m1n75trihdosatxg2715bb *   ip-172-31-22-77.ap-northeast-1.compute.internal   Ready               Active              Leader
xbulstj8e2hvcrblxpzo1q77u     ip-172-31-5-116.ap-northeast-1.compute.internal   Ready               Active              
[aws] ~ $ docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS                                 NAMES
cf367e778241        dockercloud/server-proxy:latest             "/run.sh"                8 minutes ago       Up 8 minutes        80/tcp, 443/tcp, 1936/tcp, 2376/tcp   dockercloud-server-proxy.p07m1n75trihdosatxg2715bb.mtqhtaiq3jubz2dfedw7le402
a3fbba040fee        docker4x/shell-aws:17.06.0-ce-aws1          "/entry.sh /usr/sb..."   10 minutes ago      Up 10 minutes       0.0.0.0:22->22/tcp                    shell-aws
43b5210b8df2        docker4x/l4controller-aws:17.06.0-ce-aws1   "loadbalancer run ..."   10 minutes ago      Up 10 minutes                                             l4controller-aws
978b50a5af21        docker4x/meta-aws:17.06.0-ce-aws1           "metaserver -iaas_..."   10 minutes ago      Up 10 minutes       172.31.22.77:9024->8080/tcp           meta-aws
cd8787f9cf64        docker4x/guide-aws:17.06.0-ce-aws1          "/entry.sh"              11 minutes ago      Up 11 minutes                                             guide-aws
[aws] ~ $ 

swarm manager node で docker コマンドが実行された結果が、表示されていますね。 文章での説明が少し難しいので、以下の記事にある GIF アニメを見て頂くのがイメージし易いかと思われます。

詳細については、下記ドキュメントを参照願います。

さいごに

Docker Swarm Node が、ELB のヘルスチェックに失敗し、EC2 インスタンスの入れ替えが発生した場合に適切な初期化処理が実施されず Docker Cloud の Swarms から外れてしまう現象が発生しました。 また、入れ替えられた EC2 インスタンスで Docker Cloud への登録作業を実施すると以下のエラーが発生し登録作業が行なえませんでした。

~ $ docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock dockercloud/registration
Unable to find image 'dockercloud/registration:latest' locally
latest: Pulling from dockercloud/registration
486a8e636d62: Pull complete 
af5c6e97aa7e: Pull complete 
a2fa9dd1e6fe: Pull complete 
Digest: sha256:edfd454745e790041df692fc9bf46b4f968433dea7e968207718ba1be3d96766
Status: Downloaded newer image for dockercloud/registration:latest
Error response from daemon: {"message":"This node is not a swarm manager. Use \"docker swarm init\" or \"docker swarm join\" to connect this node to swarm and try again."}

サービスとしては現状 BETA という位置付けであり品質を求めてはいけない状況ですが、常用するにはまだまだ早いのかな?という印象を受けました。

しかしながら、前回の記事で、SSH トンネルを掘った後、DOCKER_HOST 環境変数を設定することによりシームレスにコンテナが起動出来るとお伝えしましたが Docker ID を利用し、Docker Cloud と Docker for Mac を連携させることで諸々の作業が不要となり、一歩進んだコンテナ環境を構築することが出来るものと考えます。 また、Docker Cloud には Organization の機能があるため、チームで Docker for AWS 環境を利用するという事が出来るのかもしれません。(未調査) Swarms in Docker Cloud (Beta) の BETA が取れ、正式にリリースされれば手元の Docker for Mac から AWS や Azure 上の Swarm ノードへ 気軽にコンテナを起動することが出来るようになると思われるため、正式版のリリースを(個人的に)期待したいと思います。

ではでは