Docker Swarm模式下的浏览器服务容器

时间:2017-01-11 09:31:54

标签: nginx docker virtualbox docker-swarm

我使用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 network create -d overlay 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个容器中的一个)。 我怎么能这样做?

[edit]:我可以指向我的swarm节点,只需浏览到VM_IP:SERVICE_PORT,即:

192.168.99.102:8200

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

2 个答案:

答案 0 :(得分:5)

添加上面提供的答案@ ben-hall; Docker 1.13将为mode=host标志引入高级语法,其中包括发布服务端口的myservice发布模式(请参阅此处的pull-request:docker#27917docker#28943 )。使用此模式,支持服务的容器(任务)的端口将直接在运行它们的主机上发布,从而绕过Routing Mesh(因此,负载平衡器)。

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

在docker 1.13及以上;以下示例创建docker service create \ --name=myservice \ --publish mode=host,target=80,published=8080,protocol=tcp \ nginx:alpine 服务,任务的端口80在部署任务的节点的端口8080上发布。

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 列);

select * from db_basic where FIND_IN_SET($special, special);

答案 1 :(得分: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