一、如何访问service
1.查看网络配置:
docker inspect 3efaf04300
ip地址为172.17.0.2,实际上连接到的是docker默认bridge网络。
可以直接在swarm1 上访问网络
这样的访问仅仅是在容器层面访问,服务器没有暴露给外部网络,只能在docker主机上访问。
二、从外部访问service
要将service暴露在外部,方法很简单
docker service update --publish-add 8080:80 web_server
docker servuce create --name web_server --publish 8080:80 --replicas=2 httpd
容器在端口上监听http请求 --publish-add 8080:80 将容器的80映射到主机的8080端口,这样外部网络就可以访问service了
三、routing mesh
当我们访问任何节点的8080端口时,swarm内部的load balancer 会将请求转发给web_server其中的一个副本。这就是routing mesh的作用。所以,无论访问那个节点,及时该节点上没有运行service的副本,最终都能访问到service。
我们还可以配置一个外部load balancer 将请求路由到swarm service。 比如配置HAProxy,将请求分发到各个节点的8080端口。
1.ingress网络
当我们应用--publish--add 8080:80时 swarm会从新配置 service,我们看看容器都发生了哪些重要变化。
容器的网络与--pubilish-add之前不一样了,而且有两块网卡,每块网卡连接不同的docker网络。
实际上:
eth33连接的是一个overlay类型网络名字为ingress 其作用让运行在不同主机上的容器可以互相通信
eth1 连接的是一个bridge类型的网络,名字为docker_gwbridge,其作用是让容器能够访问到外网。
ingress网络是 swarm创建时docker为自动我们创建的,swarm中的每个node都能使用ingress。
四、service之间如何通信。
微服务架构的应用由若干service组成。比如有运行httpd的web前端。有提供缓存的memcached,有存放数据的mysql,每一层都是swarm的一个service,每个service运行了若干容器。
1.服务发现
一种实现办法是将所有service都publish出去,然后通过routing mesh访问,但明显的缺点是把memcache和mysql也暴露到外网,增加了安全隐患。
如果不publish,那么swarm就要提供了一种机制,能够:
1.让service通过简单的方法访问到其他的service。
2.当service副本的ip发生变化时,不会影响到访问该service的其他service。
3.当service的副本数发生变化时,不会影响访问该service的其他service
2.创建overlay网络
要使用服务发现,需要相互通信的service必须属于用一个overlay网络,所以我们先得创建一个新的overlay网络
docker network create --driver overlay myapp
3.部署service到overlay
①、 部署一个web服务,并将其挂载到新创建的overlay网络
docker service create --name my_web --replicas=3 --network myapp 192.174.1.43:5000/httpd
②、部署一个服务用于测试,挂载到同一个overlay网络
docker service create --name util --network myapp busybox sleep 10000000
sleep 10000000的作用是保持busybox容器处于运行状态,我们才能够进入容器访问service my_web
4.验证
可以查看到util在的节点是node2
如果ping服务名ping不同 但是ping容器名、IP地址 vip的ip都可以通的情况是因为dns导致。
我们可以看到my_web的ip为10.0.2.2 这是my_web service的vip swarm将会对vip访问负载均衡到每一个副本。