目标是使用 Linux 服务器和运行 Docker For Windows 的 Windows 10 机器运行混合操作系统 Docker swarm
目前,如果 --endpoint-mode 标志设置为“dnsrr”,则理论上在混合操作系统群上支持 Windows 工作者。这是解释here。然而,尝试使用 traefik 路由到一个简单的 docker whoami 镜像stefanscherer/whoami镜像失败了。
最小失败示例
// 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 仪表板找出规则路由到的 URL,例如“10.0.0.12:8080”。然后我将其与每个任务的 IP 地址进行比较,可以使用 来查看任务docker service ps
,并使用 找到它们的地址
docker inspect <taskID> \
--format '{{ range .NetworksAttachments }}{{ .Addresses }}{{ end }}'
问题
发送到管理器 IP 的带有标头“Host:whoami.docker”的 HTTP 请求在路由到管理器时会成功,而在路由到 Windows 工作者上的 Windows 任务时会失败并显示 504 Gateway Timeout。