こんにちは!インフラエンジニアの先輩です。
Kubernetes(K8s)は確かに強力ですが、いざ個人開発や小規模なプロダクトで使おうとすると、その複雑さ(=Cognitive Load)に圧倒されて挫折しそうになりませんか?「コンテナの複数台オーケストレーションを、もっとシンプルに、今すぐ始めたい!」そんなあなたにこそ、Docker Swarmをおすすめします。
Docker Swarmの美しさは、「いつものDockerコマンドがそのままマルチホストで動く」という圧倒的な体験価値にあります。特別なマニフェストファイルを大量に書く必要はありません。
今回は、AWSやさくらのクラウドなどのIaaS上に用意した2台のサーバーを使って、わずか5分でマルチホストのDocker Swarmクラスターを構築し、動かす手順をハンズオン形式で徹底解説します。これをマスターすれば、明日からのコンテナデプロイが劇的に楽になりますよ!
—
0. ざっくり理解するDocker Swarmのアーキテクチャ
ハンズオンに入る前に、頭の中にインフラの地図を描いておきましょう。Swarmの構成要素は非常にシンプルです。
- マネージャーノード (Manager Node): クラスターの頭脳です。オーケストレーションのスケジュール、サービスの定義、ワーカーの管理を行います。
- ワーカーノード (Worker Node): クラスターの手足です。マネージャーからの指示を受けて、実際にコンテナを稼働させます。
今回は、「マネージャー1台」「ワーカー1台」の計2台のサーバー(インスタンス)を用意し、通信できるようにセットアップします。
—
1. 事前準備:サーバーのネットワーク要件
クラウド上でインスタンスを2台(例: `manager-node`, `worker-node`)立ち上げてください(OSはUbuntu 22.04 LTSなどを推奨します)。
ここで最も重要なのがセキュリティグループ(ファイアウォール)の設定です。Docker Swarmのノード間通信には、以下のポートが開放されている必要があります。これを開け忘れると、永遠にノードが結合できずにハマるので最初に確認しましょう。
| ポート番号 | プロトコル | 用途 |
| :— | :— | :— |
| `2377/tcp` | TCP | クラスター管理用の通信(マネージャー必須) |
| `7946/tcp` / `7946/udp` | TCP/UDP | ノード間通信のディスカバリー(オーバーレイネットワーク) |
| `4789/udp` | UDP | Ingressネットワーク(オーバーレイネットワークのデータプレーン) |
※ 同一VPC内であれば、内部トラフィックは全許可にしておくとスムーズです。
—
2. ステップ1:両方のノードにDockerをインストールする
まずは両方のサーバーにSSHでログインし、Docker Engineをインストールします。公式の便利スクリプトを使うと一瞬です。
managerとworkerの両方のサーバーで実行
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
一般ユーザーでもdockerコマンドが叩けるように権限を追加(必要に応じて)
sudo usermod -aG docker $USER
※反映させるために、一度ログアウトして再ログインするか、`newgrp docker`を実行してください。
—
3. ステップ2:マネージャーノードの初期化
いよいよSwarmクラスターの誕生です。`manager-node`にSSHでログインし、以下のコマンドを実行します。
docker swarm init –advertise-addr
実行結果の例:
Swarm initialized: current node (1z34abc…) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join –token SWMTKN-1-4999…
おめでとうございます!たった1行で、このサーバーはSwarmマネージャーになりました。
そして画面に出力された `docker swarm join …` から始まるコマンド(トークン付き)を必ずコピーしておいてください。これがワーカーを迎え入れるための「招待状」になります。
—
4. ステップ3:ワーカーノードをクラスターに参加させる
次は `worker-node` にSSHでログインします。先ほどコピーした「招待状(`docker swarm join`コマンド)」をそのまま貼り付けて実行してください。
worker-node側で実行(トークンはご自身の環境のものに置き換えてください)
docker swarm join –token SWMTKN-1-4999…
実行結果:
This node has joined a swarm as a worker.
たったこれだけです!これでマルチホストのクラスターが結ばれました。
—
5. ステップ4:クラスターの状態を確認する
再び `manager-node` に戻り、現在のクラスターの健康状態を確認してみましょう。
manager-node側で実行
docker node ls
実行結果の例:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
1z34abc… manager-node Ready Active Leader 24.0.5
9y87xyz… worker-node Ready Active 24.0.5
`STATUS` が `Ready` になり、`MANAGER STATUS` に `Leader` が表示されていれば、美しく完璧な環境構築の完了です!
—
6. 動作確認:マルチホストでのコンテナオーケストレーション
せっかくなので、Docker Swarmの真骨頂である「サービスのデプロイ」を体験しましょう。
Swarmでは、コンテナ単体ではなく「サービス(Service)」という単位で管理します。これにより、指定した数のコンテナ(レプリカ)が自動的に各ノードに分散配置されます。
以下のコマンドを `manager-node` で実行してください。Nginxのコンテナを「3つ」起動する指示を出します。
3つのレプリカを持つNginxサービスを作成
docker service create \
–name web-server \
–publish 8080:80 \
–replicas 3 \
nginx:alpine
コマンドが成功したら、どのノードでコンテナが動いているか確認してみましょう。
docker service ps web-server
実行結果の例:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
abc web-server.1 nginx:alpine worker-node Running Running 3 seconds ago
def web-server.2 nginx:alpine manager-node Running Running 3 seconds ago
ghi web-server.3 nginx:alpine worker-node Running Running 3 seconds ago
なんと、マネージャーノードとワーカーノードに自動的に負荷分散され、コンテナが綺麗に配置されていることがわかります!
どちらのノードのIPに対しても `ポート 8080` でアクセスすれば、どこにリクエストが飛んでもNginxのウェルカムページが表示されます(Swarmの優れたルーティングメッシュ機能によるものです)。
—
お片付け(クリーンアップ)
ハンズオン終了時は、以下のコマンドで綺麗にリソースを解放できます。
サービスの削除 (manager-nodeにて)
docker service rm web-server
ワーカーの離脱 (worker-nodeにて)
docker swarm leave
マネージャーの離脱 (manager-nodeにて)
docker swarm leave –force
—
先輩からのアドバイス
いかがでしたでしょうか? 複雑な設定ファイルを書くことなく、いつものDockerの延長線上でマルチホスト環境が手に入りましたよね。
Docker Swarmは、小〜中規模なシステムにおいて「最小限の学習コストで、最大限の堅牢性とオートスケーリング」を手に入れるための最高の選択肢です。「K8sを学ぶのはちょっとハードルが高いけれど、複数台でコンテナを動かしたい」という現場のニーズに完璧に応えてくれます。
これをベースに、次は「スタックファイル(Docker ComposeのSwarm版)」を使った宣言的なインフラ構築にステップアップしてみてください。あなたのインフラライフが、より快適でエキサイティングなものになることを応援しています!