Docker container vs Docker compose vs Docker swarm vs Kubernetes
これはなに?
Docker compose と Docker swarm と Kubernetes(k8s) はコンテナオーケストレーションの文脈で語られることがあるので比較をまとめる。(比較のために container も書いておく)
ざっくりこんなイメージ
container(単一責務) < compose(複数責務= 1app) < swarm(複数app = 1システム) =< k8s (複数appかつリソース管理が柔軟)
Docker container
コンテナとは、プロセスやネットワーク、ファイルシステム等を独立した名前空間に隔離できるようにしたもの。同じノードで動くコンテナは、同じカーネルを共有する。
ファイルシステムごと入れ替えている(/配下全体)ので、異なるディストリビューションをベースにしたイメージを同じノードで動かすことは可能。あるイメージは Ubuntu をベース、 別のイメージは alpine ベースで、それぞれを同じノードで実行できているのはそのため。
Docker container 内で複数プロセス動かすことはもちろん可能(passengerとか)。なのでコンテナで実行できるものはプロセスと呼ばず、サービスと呼んだほうがいいかもしれない。一つの責務をサービスとして詰め込み実行できるよう、DockerfileでDocker imageを作成し、独立した環境で実行できるようにしたものをコンテナと呼んでいるのかも。
Docker Compose
Docker Compose は複数のコンテナをまとめて起動できるツール。設定ファイルである docker-compose.yml にはサービスやストレージである volume 、サービス間を通信できるようにした network を定義する。volume が定義されていなければ永続化されない。また network が定義されてなければ default を作成する。
docker-compose が起動中、別の定義ファイルを docker-compose up できる。
Docker Swarm
Docker Swarm は複数のノードに適宜サービスを配分してまとめて起動できるツール。利用するには master ノードと worker ノードが必要。設定ファイルは docker-compose.yml だが、deploy 等 swarm 用の設定が必要。特定のサービスの実行数を制御する replica や実行ノードを制限する constraint がある。特に、同じノードでサービスが起動していないと local にマウントした volume は共有できないので注意が必要。 Docker Swarm は Docker Compose とは違い、複数の compose ファイルを stack としてデプロイできる docker stack コマンドがあり、composeファイルを stackとして swarm にデプロイしていく。 ローカルの開発環境ではサービスを compose ファイルにまとめておき、必要なタイミングで stack deploy できるとよさそうだ。試してみたが、master ノードだけを立ち上げ、利用することはできなかった。 ネットワーク構成の関係でk8s環境と同居するのも難しそう。Docker/Kubernetes実践開発入門を一通りやって見る過程で、swarm環境だとMySQLの master / slave 構成を構築できなくなっていた。Kubernetesを使って見るために microk8s 環境をubuntuに導入した。その後 overlay network を作成していても master / slave 間での通信ができなくなっていた。 microk8s 環境をインストールしたときにシステム構成をいじる警告が出たので microk8s が原因ではないかと見ているが、実際のところは volume と同様swarmの構成による問題かもしれない。 Kubernetes(k8s)
k8s も swarmと同様、複数のノードに定義したサービスをデプロイするツール。swarmよりも大規模向け、と言われるのは、運用に必要なリソースごとにマニフェストが定義され、リソースごとk8sクラスタに適用する。マニフェストファイルにはkindのほか apiVersion を指定できる。 apiVersion は storage.k8s.io/v1 のようにも書け、ただのバージョンだけでなく特定のドメインのものを差し込めるようになっている。
Kubernetesは各クラウドサービスが対応したマネジメントサービスをリリースしている。用意されているマネジメントサービスはk8sが用意しているリソースを統一したインタフェースとして各クラウドサービスが実装した、ようなものだろうか。GKEを触った感触はそんな感じだった。