前面咱们已经学习了如何部署 service,也验证了 swarm 的 failover 特性。不过截止到如今,有一个重要问题尚未涉及:如何访问 service?这就是本节要讨论的问题。html
为了便于分析,咱们从新部署 web_server。node
① docker service rm
删除 web_server,service 的全部副本(容器)都会被删除。web
② 从新建立 service,此次直接用 --replicas=2
建立两个副本。docker
③ 每一个 worker node 上运行了一个副本。网络
好了,如今 service 已经在那里了,咱们如何访问呢?curl
要访问 http 服务,最起码网络得通吧,服务的 IP 咱们得知道吧,但这些信息目前咱们都不清楚。不过至少咱们知道每一个副本都是一个运行的容器,要不先看看容器的网络配置吧。ide
在 swarm-worker1 上运行了一个容器,是 web_server 的一个副本,容器监听了 80
端口,但并无映射到 Docker Host,因此只能经过容器的 IP 访问。查看一下容器的 IP。学习
容器 IP 为 172.17.0.2
,实际上链接的是 Docker 默认 bridge
网络。ui
咱们能够直接在 swarm-worker1 上访问容器的 http 服务。url
但这样的访问也仅仅是容器层面的访问,服务并无暴露给外部网络,只能在 Docker 主机上访问。换句话说,当前配置下,咱们没法访问 service web_server。
要将 service 暴露到外部,方法其实很简单,执行下面的命令:
docker service update --publish-add 8080:80 web_server
若是是新建 service,能够直接用使用
--publish
参数,好比:
docker service create --name web_server --publish 8080:80 --replicas=2 httpd
容器在 80 端口上监听 http 请求,--publish-add 8080:80
将容器的 80 映射到主机的 8080 端口,这样外部网络就能访问到 service 了。
你们可能会奇怪,为何 curl 集群中任何一个节点的 8080 端口,都可以访问到 web_server?
这实际上就是使用 swarm 的好处了,这个功能叫作 routing mesh,咱们下一节重点讨论。
书籍:
1.《天天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html
2.《天天5分钟玩转OpenStack》
https://item.jd.com/12086376.html