ちょっと今後Dockerのswarm modeについて整理するので
概念やら用語やらを少し整理。
ちょくちょく追記していく予定。
目的
Docker Engine 1.12でswarmがEngineに組み込まれたので、
改めて概念や用語について整理する。
あくまでも私としての認識なのでその点ご注意。
公式のドキュメントなどとは多少ずれてるやもしれない。
swarm modeの構成
全体イメージ
覚えておかないとしんどいのは以下の4つの概念。
用語 | 内容 |
---|---|
Swarm | Dockerで構成されたクラスタのこと |
ノード | 単一Dockerホスト |
サービス | 同一タスク(コンテナ)の集合 |
タスク | 単一コンテナ(厳密にはその中で実行されている処理) |
個別の概念
Swarm
単一のDockerホスト(ノード)のクラスタのこと。
複数のノードが強調して動くことであたかも単一の
大きなリソースプールを持っているかのように見せかける。
ノード
ノードは単一のDockerデーモンが動作している
VMまたは物理ホストのこと
ノードの種別
ノードの種別 | 内容 |
---|---|
マネージャ | クラスタの状態管理可能なノード |
ワーカ | コンテナを立ち上げることが可能なノード |
なお、マネージャノードはワーカノードを兼ねる。
マネージャ/ワーカの切り替えも可能。
マネージャノードの役割
swarm全体の状態を管理する。
swarmが管理者が望む(desired)状態になっているかなどを監視し、それに近づけられるよう集約する。
単一のswarmないに複数のマネージャノードが存在する場合は
そのうちの一つがリーダとして振舞う。
マネージャノードを複数確保することの利点
単純にマネージャノードが複数あることで、
マネージャノードが死んでもswarm全体としては
正常に動作しつづけることができる。
厳密には、マネージャノードの台数に対して
何台までのマネージャノードの停止にswarmが耐えられるかは以下の数式に従う。
\frac{n-1}{2}
n: swarm内のマネージャノード数
ワーカノードの役割
マネージャノードからの指示を受けてタスク(コンテナ)の起動・停止を行っている。
単一のノードに収まりきれないようなタスクの起動はできない。
(ノードをまたがることはできない。まあ、コンテナだし)
サービス
サービスとは、同一の複数タスクから構成される。
どのノードで個別のタスクを実行するかは、マネージャノード
(のリーダ)が決定する。
サービス間の通信
swarmではサービス間で通信を行うことでコンテナ間の通信を実現する。
サービス間の通信は サービス名 を用いて行う。
swarm内ではDNSが動作しており、タスク名および、
サービス名での通信が可能
サービス名で通信を行う場合は同一サービスに含まれるタスク(コンテナ)に対して自動的に負荷分散される。
つまり、暗黙的に内部ロードバランサが存在する
swarm外からのアクセス
サービスにおいてswarm外からアクセスできるように設定した場合は、コンテナが1つしかない場合でも全てのノードから単一のノードに対してのアクセスが可能。
まとめ
ざっくりと Apache-Tomcat-DBから構成される
webアプリケーションを構成すると以下のような形になる。
あくまでもイメージなのでご注意。この構成で
正しくアプリが動くことも保証しない(てか動かんな)
サービス間の通信サービス名で行うので
WebレイヤサービスからAPレイヤサービスを呼び出すときは
WebレイヤサービスにはAPレイヤサービスのサービス名を記述すれば良い。APレイヤサービスからDBレイヤサービスを呼び出す際も同様。