目的は、Linux サーバーと Docker For Windows を実行する Windows 10 マシンを使用して、混合 OS Docker swarm を実行することです。
現在、Windows ワーカーは、理論的には、--endpoint-mode フラグが「dnsrr」に設定されている場合、混合 OS スウォームでサポートされています。これについては、こちらで説明しています。ただし、traefik を使用して単純な docker whoami image stefanscherer/whoami image にルーティングしようとする試みは失敗しました。
最小限の失敗例
// On (Linux) Manager Node:
docker swarm init --advertise-addr <hostaddress> --listen-addr <hostaddress>:2377
// On (Windows 10) Worker Node:
docker swarm join <jointoken>
// On Manager Node:
docker network create --driver=overlay traefik-net
docker service create \
--name traefik \
--constraint=node.role==manager \
--publish 80:80 --publish 8080:8080 \
--mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
--network traefik-net \
traefik \
--docker \
--docker.swarmmode \
--docker.domain=traefik \
--docker.watch \
--web
docker service create \
--name whoami \
--label traefik.enable=true \
--label traefik.frontend.rule=Host:whoami.docker \
--label traefik.protocol=http \
--label traefik.docker.network=traefik-net \
--label traefik.backend.loadbalancer.method=drr \
--label traefik.backend=whoami \
--network traefik-net \
--mode global\
--label traefik.port=80 \
stefanscherer/whoami
Traefik はバックエンド ルールを正常に設定し、ルーティングを確認するために、traefik ダッシュボードを使用して、「10.0.0.12:8080」などのルールによってルーティングされる URL を見つけました。次に、これを各タスクの IP アドレスと比較します。タスクは で表示できdocker service ps
、それらのアドレスは を使用して見つけられます
docker inspect <taskID> \
--format '{{ range .NetworksAttachments }}{{ .Addresses }}{{ end }}'
問題
マネージャーの IP に送信されたヘッダー 'Host:whoami.docker' を持つ HTTP 要求は、マネージャーにルーティングされると成功し、Windows ワーカーの Windows タスクにルーティングされると 504 ゲートウェイ タイムアウトで失敗します。