#
ドキュメント

Document

自分のための備忘録です。

Docker Swarm

swarm モード導入ガイド

ゴール

Docker Swarmで異なるVPCに配置したインスタンスのコンテナ間で通信します。
具体的には異なるAWS VPCにNginxコンテナとUbuntuコンテナを配置してcurlを使ってコンテンツを取得します。

前提

  • managerと2つのworker(以降worker1、worker2)で構成する
  • ホストOSは EC2インスタンス(Ubuntu 22.04.1 LTS)を使用する
  • ネットワークドライバはoverlayを使用する
  • managerはVPC 10.0.0.0/16に配置する
  • worker1はVPC 10.0.0.0/16に配置する
  • worker2はVPC 10.1.0.0/16に配置する
  • VPC 10.0.0.0/1610.1.0.0/16VPC Peeringで接続する
  • worker1にnginx:latestコンテナを1つ稼働させる
  • worker2にubuntu:latestコンテナを1つ稼働させる
  • worker2はcurlでworker1のコンテンツを取得する

overlay ネットワークドライバ

OSI参照モデルのレイヤ3に論理的なレイヤ2を構築するVXLAN技術を使用して同一セグメントのように扱います。
そのため異なるネットワークに配置したコンテナを論理的なまとまりとして管理できます。

こちらは物理ネットワーク的だけでなく、物理的に同一ネットワークでもDocker Network的に異なるネットワークの場合にも当てはまります。

準備

Dockerホスト

各インスタンスにDockerをインストールします。
インストール方法はInstall Docker Engine on Ubuntuを参照してください。

EC2 セキュリティグループ

  • TCP port 2377 は、クラスタ管理通信のため
  • TCP と UDP の port 7946 は、ノード間の通信のため
  • UDP port 4789 はオーバレイ・ネットワーク・トラフィックのため

暗号化したオーバレイ・ネットワーク( --opt encrypted )の利用を計画中であれば、 ip プロトコル 50 (ESP) トラフィックの許可も必要です。

ref. swarm モード導入ガイド

Docker Swarmはノード間をポート7946で通信します。 例えばノードから別ノードへHTTP(80)で通信する場合もホスト上ではTCP/UDP 7946が使用されます。

上記よりホストのセキュリティグループは80ではなく7946を許可する必要があります。

Manager

EC2_Management_Console

Worker

EC2_Management_Console

managerを構築

managerは10.0.0.10のインスタンスに構築すると仮定して進めます^docker_install

manager-ip-10-0-0-10$ sudo docker swarm init --advertise-addr=10.0.0.10

ノードを確認します。

manager-ip-10-0-0-10$ sudo docker node ls
ID                            HOSTNAME        STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
xxxxxxxxxxx *   ip-10-0-0-10    Ready     Active         Leader           23.0.1

managerが作成されています。

後述するworkerを追加するためのコマンドは以下のコマンドで取得できます。

manager-ip-10-0-0-10$ sudo docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join --token {{トークン}} 10.0.0.10:2377

workerを構築

worker1

worker1を構築します。

worker1はVPC 10.0.0.50のインスタンスに構築すると仮定して進めます^docker_install
10.0.0.50のインスタンスで以下コマンドを発行します。

worker1-ip-10-0-0-50$ docker swarm join --token {{トークン}} 10.0.0.10:2377

manager(10.0.0.10)でノードを確認します。

manager-ip-10-0-0-10$ sudo docker node ls
ID                            HOSTNAME        STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
xxxxxxxxxxx *   ip-10-0-0-10    Ready     Active         Leader           23.0.1
xxxxxxxxxxx     ip-10-0-0-50    Ready     Active                          23.0.1

worker2

worker2を構築します。

worker2はVPC 10.1.0.100のインスタンスに構築すると仮定して進めます^docker_install
10.1.0.100のインスタンスで以下コマンドを発行します。

worker2-ip-10-1-0-100$ docker swarm join --token {{トークン}} 10.0.0.10:2377

manager(10.0.0.10)でノードを確認します。

manager-ip-10-0-0-10$ sudo docker node ls
ID                            HOSTNAME        STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
xxxxxxxxxxx *   ip-10-0-0-10    Ready     Active         Leader           23.0.1
xxxxxxxxxxx     ip-10-0-0-50    Ready     Active                          23.0.1
xxxxxxxxxxx     ip-10-1-0-100    Ready     Active                          23.0.1

overlay ネットワークを構築

subnetを172.20.0.0/24のoverlay ネットワークを構築する仮定して進めます。

manager-ip-10-0-0-10$ sudo docker network create -d overlay --subnet 172.20.0.0/24 --attachable sample

worker1、worker2にコンテナを作成

Docker Swarmの準備ができたのでworker1にNginxコンテナを作成します。 またworker2にNginxコンテナにHTTPリクエストするためのコンテナを作成しま。

コンテナを作成

worker1

Nginxコンテナを作成します。
sample overlayネットワークの172.20.0.3に配置します。

worker1-ip-10-0-0-50$ sudo docker run -itd --name web -h web --network sample --ip 172.20.0.3 nginx:latest

worker2

Ubuntuコンテナを作成します。
sample overlayネットワークの172.20.0.4に配置します。

worker2-ip-10-1-0-100$ sudo docker run -itd --name client -h client --network sample --ip 172.20.0.4 ubuntu:latest

疎通確認

疎通を確認します。

worker2-ip-10-1-0-100$ sudo docker exec -it client curl http://172.20.0.3
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>