Docker Swarmとは
Docker Swarmとは、Dockerが開発したツールで、コンテナのオーケストレーションツールを指します。2014年にDocker向けオーケストレーションのプロジェクトとして発足し、Dockerコンテナにネイティブなクラスタリング機能を提供します。
Docker Swarmは、Dockerエンジンのグループを単一の仮想Dockerエンジンとして扱うもので、その役割は現在Swarmモードが担っています。
【参考】:Docker 【参考】:Docker Docs: Docker Swarm 概要
Swarmモードの概要
当初のDocker Swarmは開発を終了し、Docker Engineに統合されたSwarmモードがクラスタ管理を行います。SwarmkitをDocker Engineに組み込んでクラスターマネジメントを可能にしたものです。
ここで言うクラスタとは、コンテナ化されたノードの集合体を指し、アプリケーションの可用性と負荷分散などに対応します。
Swarmモードは、Docker Engine 1.12以降で組み込まれており、Docker Swarm CLI(コマンドラインインターフェース)で、Swarmコンテナを実行したり、ディスカバリトークンを作成したり、クラスタ内のノードを一覧表示したりします。
Swarmのノードの一覧表示や更新、Swarmからノードの削除など、クラスターマネジメントを行います。
「Classic Swarm」とは
当初のDocker Swarmは役割を終えて開発終了されたことによって、「Classic Swarm」として記録が残されています。しかしながら、GitHubにおける「Classic Swarm」の情報掲載は2021年2月を持って更新を終了し、「Public Archive」として情報参照のみを提供しています。
Docker Docsには引き続き、従来のDocker Swarmの情報も掲載されています。
【参考】:Classic Swarm: a Docker-native clustering system 【参考】:SwarmKit 【参考】:Understanding Difference between Docker Swarm(Classic), Swarm Mode & SwarmKit
Swarmモードの特徴と機能
SwarmモードはDocker Engineに統合されており、オーケストレーションツールを別途用意する必要がありません。分散設計がされておりスケーリングや負荷分散に対応します。ローリングアップデートなど、クラスターマネジメントで必要な機能を提供します。
ノードは、マネージャーノードとワーカーノードに分類され、オーケストレーション・タスクを管理・実行します。初期設定では、マネージャーノードはワーカーノードを兼ねますので、1台でもSwarmを利用することができます。
【参考】:Docker Docs: Swarm モード概要 【参考】:Docker Docs: Swarm モードの重要な概念
KubernetesとSwarmの違い
Kubernetesは、Googleが開発したコンテナプラットフォームでオーケストレーション機能を提供します。自社のコンテナ管理の目的で開発されました。そのため、より大規模なシステム構成で複雑なワークロードに対応します。KubernetesとSwarmの違いは、ともにコンテナオーケストレーション・ソフトウェアという点では変わりません。
しかしながら、Kubernetesが大規模なクラスタリング向けなのに対してDocker Swarmは、マイクロサービス・アーキテクチャに力点を置いたもので、ロード・バランシング、サービス・ディスカバリーなどをサポートするものの、比較的小規模な構成に適している点に違いがあります。
【参考】:Kubernetes
Docker ComposeとSwarmの違い
Docker Composeは、複数のコンテナを定義し実行するためのツールです。Dockerアプリケーションのサービスを設定し、まとめてコンテナを起動するなどの手続きを設定します。
Docker ComposeとSwarmの違いは、設定の対象に違いがあります。起動するサービスを自動化する際にはDocker Composeを用い、コンテナ全体をまとめて管理し、フェイルオーバーやスケーリングするなどの場合はSwarmモードを用いる点が異なります。
【参考】:Docker Docs: Docker Compose 概要 【参考】:Docker Docs: Swarm モードの重要な概念
Docker Swarmを導入する
ここでは、Swarmモードの導入の流れについて解説していきます。セットアップするには、Docker Engine 1.12以降が必要です。1台のノードの場合でも、Swarmの初期化、サービスの作成やスケールが可能です。
ただし、マルチノードのコマンドを確認するには、マネージャーノード1台、ワーカーノード2台を用意します。
Swarmでは、必要なネットワークの通信ポートとしてTCPポート2377、TCP/UDPポート7946、UDPポート4789を使用します。必要に応じて、 ”docker network” コマンドでネットワーク設定を確認することができます。
【参考】:Docker Docs: Docker Swarm 導入チュートリアル 【参考】:Docker Docs: swarm モード導入ガイド 【参考】:Docker Docs: swarm モード・ルーティング・メッシュを使う 【参考】:Docker Docs: Docker CLI docker network
Swarmを有効化する
Swarmを有効化するには、Docker EngineがサポートするLinux環境を用意し、Docker Engineをインストールします。Docker Engineのデーモンが起動したら、マネージャーノードで、”docker swarm init”コマンドを実行します。
Swarmが起動したら、 ”docker info” に ”Swarm: Active” と表示され、Swarmクラスタが作成されます。
【参考】:Docker Docs: Docker のインストール 【参考】:Docker Docs: swarm (クラスタ)の作成
Swarmにノードを追加する
マネージャーノードでSwarmクラスタが作成されたら、ワーカーノードを追加します。
追加するには、 ”docker swarm join” コマンドを使用します。このコマンドはワーカーノードの台数分繰り返します。ノードの追加が完了すると、マネージャーノードから ”docker node ls” で確認することができます。
登録したノードは、 ”docker swarm leave” でクラスタから削除(離脱)することもできます。
【参考】:Docker Docs: swarm に他のノードを追加
Swarmにサービスをデプロイする
Swarmにサービスをデプロイするには、“docker service create”コマンドを使用します。実行中のサービスは、 ”docker service ls” で確認できます。サービスIDが分かったら、 ”docker service inspect --pretty サービスID” で詳細情報を得ることができます。
サービスの実行ノードを確認するには、 ”docker service ps サービスID” コマンドを使用します。
サービスをスケーリングする際には、サービスIDを確認後に ”docker service scale サービスID=タスク数” コマンドで、実行コンテナの数(=タスク数)を変更することができます。
【参考】:Docker Docs: swarm にサービスをデプロイ 【参考】:Docker Docs: swarm 上のサービスを調べる 【参考】:Docker Docs: swarm でサービスをスケール
Swarmの実行サービスを停止する
Swarmでは、不要なサービスを削除することができます。Swarmの実行サービスを停止するには、 ”docker service rm サービスID” コマンドを実行します。実行結果を確認するには、 ”docker service inspect サービスID” コマンドを用います。
【参考】:Docker Docs: swarm で実行中のサービスを削除
Swarmからノードを無効化する
ワーカーノードを、クラスタ環境でサービスデプロイから外す場合は無効化を行います。 ”docker node update --availability drain ノードID” コマンドで無効化することができます。再度有効化する場合は、”docker node update --availability active ノードID”を実行し、有効化します。
【参考】:Docker Docs: swarm からノードをドレイン(解放)
Docker Swarmは手軽に始められます
Swarmは、Docker Engineに統合されていますので、クラスタリングソフトウェアを追加導入することなしに使えます。小規模なクラスタリング用途には十分な機能を提供していますので、ちょっと試してみたい場合などは、Swarmが手軽でおすすめです。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから