我已经使用docker-machine创建了3个vm:
docker-machine create -d virtualbox manager1
docker-machine create -d virtualbox worker1
docker-machine create -d virtualbox worker2
这些是他们的 IP:
docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
manager - virtualbox Running tcp://192.168.99.102:2376 v1.12.6
worker1 - virtualbox Running tcp://192.168.99.100:2376 v1.13.0-rc5
worker2 - virtualbox Running tcp://192.168.99.101:2376 v1.13.0-rc5
然后docker-machine ssh manager1
和:
docker swarm init --advertise-addr 192.168.99.102:2377
然后 worker1 和 worker2 加入到集群。
现在我已经创建了一个覆盖网络:
docker 网络创建-d 覆盖 skynet
并以全局模式部署服务(每个节点 1 个任务):
docker service create --name http --network skynet --mode global -p 8200:80 katacoda/docker-http-serve
r
并且节点实际上有 1 个容器(任务)。
现在,我想直接访问我的虚拟主机……或者至少我想直接浏览我的服务容器,因为我想用 nginx 开发我的服务的负载均衡器。为此,在我的 nginx conf 文件中,我想指向一个特定的服务容器(即现在我有 3 个节点(1 个管理器和 2 个工作者)处于全局模式,所以我有 3 个任务正在运行-->我想选择这 3 个容器中的一个)。我该怎么做?
[编辑]:我可以通过浏览指向我的 Swarm 节点:,即:
192.168.99.102:8200
但仍然有内部负载平衡。我当时想,如果我指向一个特定的 Swarm 节点,我将使用该特定节点内的容器。但目前还没有。
答案1
Docker 具有入口负载平衡。它是默认的负载平衡器。您可以使用 --endpoint-mode dnsrr 命令来执行 DNS 负载平衡。
如果您想使用像 nginx 这样的外部负载平衡,首先您应该启动 Nginx 容器并将配置文件复制到正在运行的容器中并替换旧文件。然后它将指向容器发布的端口和主机。
答案2
如果你可以在主机+全球模式,您可以使用外部负载均衡器。因为通过服务全球的模式下,每个属于集群的虚拟机上只有 1 个服务任务(即一个容器)。由于主持人模式中,服务任务端口被映射到“主机”(在本例中为虚拟主机:VM)。这样,外部负载均衡器(如 nginx)就可以将传入的请求转发到IP_VM:映射端口。希望我已经说清楚了 :)