我对docker swarm感到困惑。据我所知,运行swarm的旧方法是在docker引擎为swarm模式提供原生支持之前运行管理器和容器中的worker。旧的集装箱式swarm的文档解释了如何使用consul,etcd或zookeeper设置服务发现。服务发现是必要的,因为服务是在随机端口上运行以避免冲突,对吗?
docker引擎群模式的文档没有解释如何设置服务发现。如果机制包含在swarm模式中,或文档不完整,我现在感到困惑。
在哪里可以找到有关群模式的清晰,最新的解释,以及它与服务发现等概念的关系?
答案 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 page和swarm 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 ,您必须部署自己的 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 1.12
开始,服务发现通过 Swarm模式直接包含在docker中,并带有嵌入式DNS和负载均衡器。这意味着不再需要外部组件来管理服务发现和负载平衡。
创建服务并将其分配给叠加层时,会注册其DNS名称,并且叠加层的其他服务部分可以通过其服务名称访问它。运行服务的任务使用内置LB正确负载均衡。
对于Swarm模式,“哲学”更多的是包括开箱即用的所有内容(证书管理和轮换,服务发现,负载平衡,通过内置数据存储的群集元数据,网络,调度)以确保您拥有从第一天起就可以实现最完整的系统。如果需要,您仍然可以交换和替换某些组件。