Tuo*_*nen 4 containers cluster-computing docker consul docker-swarm
我对docker swarm感到困惑.据我所知,运行swarm的旧方法是在docker引擎为swarm模式提供原生支持之前,在容器中运行manager和worker.旧的集装箱式swarm的文档解释了如何使用consul,etcd或zookeeper设置服务发现.服务发现是必要的,因为服务是在随机端口上运行以避免冲突,对吧?
docker引擎群模式的文档未说明如何设置服务发现.现在我很困惑,如果机制包含在swarm模式中,或者文档不完整.
在哪里可以找到有关群模式的清晰,最新的解释,以及它与服务发现等概念的关系?
实际上,自docker 1.12以来,docker swarm模式实现了它自己的服务发现功能.
要查看它,例如它的负载平衡功能,您可以执行以下操作:
#Setup your docker engine as a docker swarm manager
docker swarm init
#Create an nginx service
docker service create --name nginx --publish 80:80 nginx
Run Code Online (Sandbox Code Playgroud)
现在您可以使用列出服务docker service ls,并看到您有一个nginx服务.如果您执行了操作docker ps,您将看到您的容器没有直接向计算机公开任何端口,但如果您尝试检查服务,则该端口确实是公开的服务端口.因此,要访问容器,您需要连接到docker swarm管理器的地址和已发布的端口.在这里,由于您的机器是管理员,您需要访问localhost:80,或者您$DOCKER_HOST:80使用的是docker-machine或同等机器
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f9d93dbbce5 nginx:latest "nginx -g 'daemon off" About a minute ago Up About a minute 80/tcp, 443/tcp nginx.1.4zr3zacuw06ax9swuit4wbacd
> curl -X GET localhost:80
# Result showing nginx stuff
Run Code Online (Sandbox Code Playgroud)
如果您想参考文档,您可以在swarm密钥概念页面和swarm模式路由网页上获得大量信息
如果您正在运行多主机设置,就像在正常使用swarm模式时一样,您将至少有两个docker引擎以swarm模式运行:一个作为worker,一个作为manager.默认情况下,管理器也是一个工作者,可以托管容器
与群集交互时,您将始终直接与docker swarm管理器交谈.然后,您可以创建如上所述的nginx服务,并在管理器或工作节点上创建服务.然后,要通过其端口访问您的容器,您需要通过其ip访问管理器节点,它将请求转发到容器,无论是在工作者还是管理器节点上.您还可以缩放它并查看正在发生的负载平衡,因为它将以循环方式查询两个容器.
从docker 1.12开始,还有一个内部服务发现功能,允许您使用其服务dns访问其他服务.
要访问此功能,您需要创建一个覆盖网络,并将服务附加到该网络
docker network create --driver overlay mynetwork
docker service create --name nginx --network mynetwork nginx
docker service create --name testing --network mynetwork node sleep 10000 #node because it already has ping cmd
#locate your testing service's container, and ping the nginx host
docker exec -ti ping nginx
#See the magic happen
Run Code Online (Sandbox Code Playgroud)
在Docker Engine> Manage a swarm部分中,文档中还有很多内容.请参阅Swarm模式概述
虽然@MagicMicky给出的答案是正确的,但我会尝试添加关于服务发现的Swarm Legacy和Swarm Mode之间差异的更多上下文:
注意:我将Swarm的第一个版本称为Swarm legacy,将新版本称为Swarm 模式.
使用Swarm Legacy,您必须部署自己的Zookeeper,Consul或Etcd来管理集群拓扑,这意味着节点被指定为集群中的代理.这些分布式键/值存储用于健康监视和分布式锁定目的.Swarm没有使用它们来管理服务发现,而只使用集群节点发现和监视.
如果您希望通过Swarm部署容器的Service Discovery,则必须设置外部Consul/Registrator/DNS,并在这些解决方案上注册您的服务.Wagl是我专门针对Swarm构建的这种系统的一个例子.
使用更高版本的docker engine(1.11),您还可以在创建覆盖网络和将容器分配到覆盖网络时访问内置DNS.之前1.11,(有争议的)服务发现机制是通过附加服务条目/etc/hosts.
在任何情况下,Swarm都不直接包含覆盖网络,这是一个需要自己设置的独立组件.它更像是一个"附加".
通常,第一版Swarm背后的"理念"是提供一些简单可靠的东西来管理主机上的容器,如果你需要添加更多功能,例如Service Discovery或Load Balancing,你必须自己动手.
从Docker开始,1.12服务发现通过Swarm模式直接包含在docker中,并带有嵌入式DNS和Load Balancer.这意味着不再需要外部组件来管理服务发现和负载平衡.
创建服务并将其分配给覆盖时,其DNS名称已注册,覆盖的其他服务部分可通过其服务名称访问它.运行服务的任务使用内置LB正确负载均衡.
对于Swarm模式,"哲学"更多的是包括开箱即用的所有内容(证书管理和轮换,服务发现,负载平衡,通过内置数据存储的群集元数据,网络,调度),以确保您拥有最完整的系统可能从第一天开始.如果需要,您仍然可以交换和替换某些组件.
| 归档时间: |
|
| 查看次数: |
2098 次 |
| 最近记录: |