需要 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,您必须部署自己的 Zookeeper、Consul 或 Etcd 管理集群拓扑,这意味着节点被分配为集群中的代理。这些分布式 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" 更多的是包括开箱即用的一切(证书管理和轮换、服务发现、负载平衡、通过内置数据存储的集群元数据、网络、调度)以确保您从第一天起就拥有最完整的系统。如果需要,您仍然可以交换和更换一些组件。
我对 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,您必须部署自己的 Zookeeper、Consul 或 Etcd 管理集群拓扑,这意味着节点被分配为集群中的代理。这些分布式 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" 更多的是包括开箱即用的一切(证书管理和轮换、服务发现、负载平衡、通过内置数据存储的集群元数据、网络、调度)以确保您从第一天起就拥有最完整的系统。如果需要,您仍然可以交换和更换一些组件。