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

Need for service discovery for docker engine swarm mode

我对 docker 群感到困惑。据我所知,运行 集群的旧方法是 运行 容器中的管理器和工作人员,在 docker 引擎提供对集群模式的本地支持之前。旧的容器化 swarm 的文档解释了如何使用 consul、etcd 或 zookeeper 设置服务发现。服务发现是必要的,因为服务 运行 在 运行dom 端口以避免冲突,对吧?

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

现在您可以使用 docker service ls 列出服务,并看到您有一个 nginx 服务。 如果你执行 docker ps,你会看到你的容器没有直接向机器公开任何端口,但如果你尝试检查你的服务,该端口确实作为服务端口公开。因此,要访问您的容器,您需要连接到 docker swarm 管理器的地址和您发布的端口。在这里,由于您的机器是管理器,因此您需要访问 localhost:80,或者如果使用 docker-机器或等效

,则需要访问您的 $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

如果你想参考文档,你可以在swarm key concept page and on the swarm mode routing mesh page

上找到很多资料

在多主机设置中

如果您是 运行 多主机设置,就像正常使用 swarm 模式一样,您将至少有两个 docker 引擎 运行 在 swarm 模式中:一个作为工人,一个作为经理。默认情况下,manager 也是 worker,可以托管容器

与群互动时,您将始终直接与 docker 群管理员交谈。然后您可以像上面那样创建一个 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 > Manage a swarm 部分。 Swarm mode overview

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

Note: I'll refer to the first version of Swarm as Swarm legacy and the new version as Swarm mode.

使用 Swarm Legacy 进行服务发现

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

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

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

附加服务条目

无论如何,覆盖网络并未直接包含在 Swarm 中,这是一个需要自己设置的单独组件。它更像是 "add-on".

一般来说,第一版 Swarm 背后的 "philosophy" 是提供一些简单可靠的东西来跨主机管理容器,如果你需要添加更多功能,例如服务发现或负载平衡,你有自己动手。


使用 Docker Swarm 模式的服务发现

自 Docker 1.12 服务发现通过 Swarm 模式 直接包含在 docker 中 DNS 和负载平衡器。这意味着不再需要外部组件来管理服务发现和负载平衡。

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

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