2

我使用 docker-machine 创建了 3 个虚拟机:

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加入swarm。

现在我创建了一个覆盖网络:

docker network create -d overlay skynet

并以全局模式部署服务(节点的 1 个任务):

docker service create --name http --network skynet --mode global -p 8200:80 katacoda/docker-http-server

并且节点有效地有 1 个容器(任务)。

现在,我想直接访问我的虚拟主机.. 或者,至少,我想直接浏览我的服务的容器,因为我想用 nginx 开发我的服务的负载均衡器。为此,在我的 nginx conf 文件中,我想指向一个特定的服务容器(即现在我在全局模式下有 3 个节点(1 个管理器和 2 个工作人员),所以我有 3 个任务正在运行-->i'我想从这 3 个容器中选择一个)。我怎样才能做到这一点?

[编辑]:我可以简单地浏览到我的群节点VM_IP:SERVICE_PORT,即:192.168.99.102:8200,但仍然存在内部负载平衡。

我在想,如果我指向一个特定的 swarm 节点,我将在该特定节点内使用容器。但暂时没有。

4

2 回答 2

5

添加到上面提供的答案@ben-hall;Docker 1.13 将为--publish标志引入高级语法,其中包括mode=host发布服务端口的发布模式(请参阅此处的拉取请求:docker#27917docker#28943)。使用这种模式,支持服务的容器(任务)的端口直接发布在它们运行的​​主机上,绕过路由网格(以及负载均衡器)。

请记住,因此,只有服务的单个任务可以在节点上运行。

在 docker 1.13 及更高版本上;下面的例子创建一个myservice服务,任务的80端口发布到任务部署所在节点的8080端口。

docker service create \
  --name=myservice \
  --publish mode=host,target=80,published=8080,protocol=tcp \
  nginx:alpine

与通过路由网格发布端口的任务相反,docker ps还显示了为使用“主机模式”发布的任务发布的端口(见PORTS专栏);

CONTAINER ID        IMAGE                                                                           COMMAND                  CREATED              STATUS              PORTS                           NAMES
acca053effcc        nginx@sha256:30e3a72672e4c4f6a5909a69f76f3d8361bd6c00c2605d4bf5fa5298cc6467c2   "nginx -g 'daemon ..."   3 seconds ago        Up 2 seconds        443/tcp, 0.0.0.0:8080->80/tcp   myservice.1.j7nbqov733mlo9hf160ssq8wd
于 2017-01-12T10:54:32.990 回答
2

由于 SwarmMode 与 IPVS 负载均衡器一起工作的方式(在https://www.katacoda.com/courses/docker-orchestration/load-balance-service-discovery-swarm-mode讨论),不可能只访问单个容器部署为服务。

配置负载均衡器的请求在https://github.com/docker/docker/issues/23813有一个开放的 Github 问题

您可能会发现使用在每个节点上运行的代理会有所帮助。这可以配置为仅响应某些节点请求(理论上)。围绕 SwarmMode 设计的两个包括:

https://github.com/vfarcic/docker-flow-proxy

https://github.com/tpbowden/swarm-ingress-router

于 2017-01-12T09:18:35.103 回答