我使用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加入到swarm中.
现在我创建了一个覆盖网络:
docker network create -d overlay skynet
并在全局模式下部署服务(节点的1个任务):
VM_IP:SERVICE_PORT
[R
节点实际上有1个容器(任务).
现在,我想直接访问我的虚拟主机..或者,至少,我想直接浏览我的服务容器,因为我想用nginx开发我的服务负载均衡器.为此,在我的nginx conf文件中,我想指向一个特定的服务集合器(即现在我在全局模式下有3个节点(1个管理员和2个工作者),所以我有3个任务在运行 - > i我想选择这3个容器中的一个.我怎样才能做到这一点?
[编辑]:我可以指向我的swarm节点,只需浏览到VM_IP:SERVICE_PORT,即:
192.168.99.102:8200
但仍有内部负载平衡.我在想,如果我指向一个特定的swarm节点,我将在该特定节点内使用容器.但是现在没什么.
添加到上面提供的@ ben-hall的答案; Docker 1.13将为该--publish
标志引入一种高级语法,其中包括mode=host
发布服务端口的发布模式(请参阅此处的pull-request:docker#27917和docker#28943).使用此模式,支持服务的容器(任务)的端口将直接发布到它们运行的主机上,从而绕过Routing Mesh(因此,负载均衡器).
请记住,因此,只有服务的单个任务可以在节点上运行.
在码头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