docker引擎群模式需要服务发现

我很困惑docker群。 据我所知,运行swarm的旧方法是在docker引擎为swarm模式提供原生支持之前运行容器中的经理和工作人员。 旧的集装箱群的文档解释了如何使用consul,etcd或zookeeperbuild立服务发现。 服务发现是必要的,因为服务在随机端口运行以避免冲突,对吧?

docker引擎群模式的文档没有解释如何设置服务发现。 现在我很困惑,如果机制被纳入群模式,或者是文件不完整。

我在哪里可以find关于群集模式的最新解释,以及它如何与服务发现等概念相关联?

虽然@MagicMicky给出的答案是正确的,但是我会尝试在Swarm Legacy和Swarm Mode之间关于服务发现的区别上添加更多上下文:

注意 :我将把Swarm的第一个版本称为Swarm遗传 ,将新版本称为Swarm 模式

使用Swarm Legacy进行服务发现

使用Swarm Legacy ,您必须部署您自己的ZookeeperConsulEtcd来pipe理群集拓扑,这意味着将节点分配为群集中的代理。 这些分布式键/值存储被用于健康监视和分布式locking目的。 那些Swarm没有用来pipe理服务发现,而只用于集群节点的发现和监控

如果您希望通过Swarm部署您的容器的服务发现,则必须设置外部Consul /注册人/ DNS,并在这些解决scheme上注册您的服务。 Wagl是一个专门为Swarm构build的系统的例子 。

使用更高版本的Docker引擎( 1.11 ),您在创build覆盖networking和将容器分配到覆盖networking时也可以访问内置的DNS。 在1.11之前,(有争议的)服务发现机制是通过/etc/hosts附加服务条目。

无论如何,覆盖networking并不是直接包含在Swarm中,而是一个独立的组件,需要自己的设置。 这更像是一个“附加”。

一般来说,第一版Swarm背后的“哲学”就是提供一些简单而可靠的方法来pipe理跨主机的容器,如果需要添加更多function,例如服务发现或负载平衡,则必须自行推出。


使用Docker群集模式的服务发现

从Docker 1.12服务发现直接包含在Docker中,通过带有embedded式DNS和Load BalancerSwarm模式 。 这意味着不再需要外部组件来pipe理服务发现和负载平衡。

当您创build服务并将其分配给覆盖层时,其DNS名称将被注册,覆盖层的其他服务部分可以通过其服务名称进行访问。 为服务运行的任务正确地使用内置LB进行负载平衡。

对于Swarm模式,“哲学”更多的是包含所有开箱即用的function(证书pipe理和轮换,服务发现,负载平衡,通过内置数据存储的集群元数据,networking,调度),以确保您拥有最完整系统可能从第一天开始。 如果需要,您仍然可以交换和replace一些组件。

事实上,自从docker 1.12以来,docker swarm模式实现了它自己的服务发现function。

在单个主机设置(testing)

为了研究它,例如它是负载平衡function,您可以执行以下操作:

 #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 

现在您可以使用docker service ls列出服务,并且看到您有一个nginx服务。 如果你使用docker ps ,你会发现你的容器并没有将任何端口直接暴露给机器,但是如果你尝试检查你的服务,这个端口确实暴露为服务端口。 因此,要访问您的容器,您需要连接到docker群pipe理器的地址和发布的端口。 在这里,由于您的机器是经理, $DOCKER_HOST:80如果使用docker机器或同等机器,则需要访问localhost:80$DOCKER_HOST:80

 > 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 

如果您想参考文档,您可以在群集关键概念页面和群集模式路由网格页面上获得大量信息

在多主机设置

如果您正在运行多主机设置,就像您在群集模式下正常使用一样,那么至less有两个docker引擎以群集模式运行:一个作为工作者,一个作为pipe理者。 默认情况下,pipe理员也是一名工作人员,可以容纳容器

与群体交互时,您总是直接与docker群pipe理人员交谈。 然后,您可以创build一个像上面那样的nginx服务,并且可以在pipe理器或工作节点上创build该服务。 然后,通过它的端口访问你的容器,你需要通过它的ip来访问pipe理节点,这个IP会把请求转发到容器,不pipe是在工作者还是pipe理者的节点上。 您还可以对其进行缩放并查看负载平衡情况,因为它将以循环方式查询两个容器。

内部服务发现

由于docker1.12,还有一个内部服务发现function,让您使用其服务DNS访问其他服务。

要访问此function,您需要创build一个覆盖networking,并将其附加到您的服务

  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 

Docker Engine> Manage a swarm section中的文档中还有很多东西。 请参阅群体模式概述