Docker Swarm
で異なるVPCに配置したインスタンスのコンテナ間で通信します。
具体的には異なるAWS VPCにNginxコンテナとUbuntuコンテナを配置してcurlを使ってコンテンツを取得します。
Ubuntu 22.04.1 LTS
)を使用するoverlay
を使用する10.0.0.0/16
に配置する10.0.0.0/16
に配置する10.1.0.0/16
に配置する10.0.0.0/16
と10.1.0.0/16
はVPC Peering
で接続するnginx:latest
コンテナを1つ稼働させるubuntu:latest
コンテナを1つ稼働させるcurl
でworker1のコンテンツを取得するOSI参照モデルのレイヤ3に論理的なレイヤ2を構築するVXLAN
技術を使用して同一セグメントのように扱います。
そのため異なるネットワークに配置したコンテナを論理的なまとまりとして管理できます。
こちらは物理ネットワーク的だけでなく、物理的に同一ネットワークでもDocker Network的に異なるネットワークの場合にも当てはまります。
各インスタンスにDockerをインストールします。
インストール方法はInstall Docker Engine on Ubuntuを参照してください。
- 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は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
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は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
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
Docker Swarm
の準備ができたのでworker1にNginxコンテナを作成します。
またworker2にNginxコンテナにHTTPリクエストするためのコンテナを作成しま。
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
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>