需要对码头引擎群模式进行服务发现

时间:2016-11-24 12:26:06

标签: docker containers cluster-computing docker-swarm consul

我对docker swarm感到困惑。据我所知,运行swarm的旧方法是在docker引擎为swarm模式提供原生支持之前运行管理器和容器中的worker。旧的集装箱式swarm的文档解释了如何使用consul,etcd或zookeeper设置服务发现。服务发现是必要的,因为服务是在随机端口上运行以避免冲突,对吗?

docker引擎群模式的文档没有解释如何设置服务发现。如果机制包含在swarm模式中,或文档不完整,我现在感到困惑。

在哪里可以找到有关群模式的清晰,最新的解释,以及它与服务发现等概念的关系?

2 个答案:

答案 0 :(得分:5)

实际上,自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

现在您可以使用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

如果您想参考文档,可以在swarm key concept pageswarm mode routing mesh page

上获得大量信息。

在多主机设置

如果您正在运行多主机设置,就像在正常使用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

再一次,文档中有很多内容, Docker Engine>管理群组部分。 请参阅Swarm mode overview

答案 1 :(得分:5)

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

  

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

使用Swarm Legacy进行服务发现

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

如果您希望通过Swarm部署容器的Service Discovery,则必须设置外部Consul / Registrator / DNS,并在这些解决方案上注册您的服务。我专门针对Swarm构建的这种系统的一个例子是Wagl

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

在任何情况下,Swarm都不直接包含覆盖网络,这是一个需要自己设置的独立组件。它更像是一个“附加”。

一般来说,第一版Swarm背后的“理念”是提供一些简单可靠的东西来管理主机上的容器,如果你需要添加更多的功能,例如Service Discovery或Load Balancing,你必须自己动手

使用Docker Swarm模式进行服务发现

从Docker 1.12开始,服务发现通过 Swarm模式直接包含在docker中,并带有嵌入式DNS和负载均衡器。这意味着不再需要外部组件来管理服务发现和负载平衡。

创建服务并将其分配给叠加层时,会注册其DNS名称,并且叠加层的其他服务部分可以通过其服务名称访问它。运行服务的任务使用内置LB正确负载均衡。

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