
TL;DR
- ブラウザでSwarmのクラスタを試す
Play with Docker
ブラウザ上でDockerを試せるサイト
特徴としては以下
Swarm
Dockerオーケストレーションツールの1つ。
Docker公式のツールで、dockerデーモンに最初から搭載されている。
また、同様にdockerデーモンに搭載されているdocker-composeと相性が良い*1。
Kubernetesと比較して シンプルかつセキュリティ面に優れている
Swarmのコンポーネント
Swarmで登場する各コンポーネントについて
| name | note |
|---|---|
| ノード | Swarmクラスタに参加するインスタンスを指す。 |
| マネージャ | クラスタの管理を行うノードを指す。k8sでいうコントロールプレーン |
| ワーカー | リソースプールを提供するノードを指す。ワーカーノード |
| Task | コンテナのことをTaskと呼ぶ。1コンテナ1Taskで、サイドカーはTaskで実現できない模様。 |
| Service | 起動するTaskと起動数を定義し、その維持を行う。冗長化とかセルフヒーリングを司る。 |
| スケジューラ | どのTaskをどのインスタンスへ配置するかを決定する |
| Raftコンセンサス | 分散アルゴリズムの1つ。Swarm上での意思決定はこのアルゴリズムが用いられ、その特性上マネージャは奇数インスタンス必要。 |
Play with DockerでSwarmを試す
1. サイトへアクセス
https://labs.play-with-docker.com を立ち上げ、ログインする。
DockerHub IDが必要。

2. インスタンスの起動
起動すると↓な画面が表示され、4時間のカウントダウンが始まる。
さっさと"Add Instance" でインスタンスを増やす。

インスタンスを追加するとコンソールとその他メタデータが表示される

3. Swarmの初期化
$ docker swarm init --advertise-addr eth0 でSwarmの初期化を実行。
ethが2つあるのでとりあえず "eth0" へ所属させる。

initを実行したインスタンスがマネージャになり、このマネージャに他インスタンスをワーカーとして所属させるための $ docker swarm join コマンドが出力される。
どうせ使い捨ての環境なのでトークンとかはマスクしない。GUIをグイグイして画像編集するのはめんどい。
4. ワーカーの作成
クラスター構成にしたいので2台目のインスタンスを作成する。
"Add Instance"で2台目のインスタンスを作成し、作成したインスタンスで先程取得した $ docker swarm join ... を打ってマネージャに所属させる。

マネージャで $ docker node ls を打ち、2台のノードが存在することを確認

5. Serviceの作成
試しにnginxを立ててみる。
"myapp" という名前で "tcp/8080" を開放する "nginx"を作成。
$ docker service create --name myapp --publish 8080:80 nginx

無事Serviceが起動できるとIPの横に "8080" というリンクが現れ、リンクを踏むことでブラウザ上から動作確認ができる。便利。

6. Serviceの冗長化
クラスタ構成にしたのでワーカーを跨ってServiceを配置するよう冗長構築にしてみる
$ docker service update myapp --replicas 4
実行後に $ docker service ps myapp を実行し、複数のノードにTaskが冗長化されていることを確認。

7. ログの確認
ちゃんと負荷分散されているかログを確認する
$ docker service logs -f myapp

別々のノードにトラフィックが割り振られていることが確認できた。
所感
触ろう触ろうと思ってたSwarmをやっと触った。
ブラウザからクラスタを試せるのは素直に凄い
雑な感想として、本番で使うかと言われたら「KubernetesかECS使う」って答えるだろうなーと。
AWSであればECSが相性良すぎて一択だと思っているのと、他の環境であればKubernetesの方が自由度が高い*2なと。
あとそもそもオートスケーリングの機構がないので、わざわざ「クラウドな本番環境」で使用する選択肢があまり思い浮かばなかった(クラウド好き並感)。