一、如何访问service

    1.查看网络配置:

docker inspect 3efaf04300

     

docker swarm init docker swarm init 跨网段_docker

ip地址为172.17.0.2,实际上连接到的是docker默认bridge网络。

可以直接在swarm1 上访问网络

     

docker swarm init docker swarm init 跨网段_docker_02

这样的访问仅仅是在容器层面访问,服务器没有暴露给外部网络,只能在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了

   

docker swarm init docker swarm init 跨网段_docker swarm init_03

三、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,我们看看容器都发生了哪些重要变化。

docker swarm init docker swarm init 跨网段_80端口_04

容器的网络与--pubilish-add之前不一样了,而且有两块网卡,每块网卡连接不同的docker网络。

 实际上:

      eth33连接的是一个overlay类型网络名字为ingress 其作用让运行在不同主机上的容器可以互相通信

      eth1 连接的是一个bridge类型的网络,名字为docker_gwbridge,其作用是让容器能够访问到外网。

      

docker swarm init docker swarm init 跨网段_docker swarm init_05

   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

docker swarm init docker swarm init 跨网段_80端口_06

3.部署service到overlay

      ①、 部署一个web服务,并将其挂载到新创建的overlay网络

docker service create --name my_web --replicas=3 --network myapp 192.174.1.43:5000/httpd

    

docker swarm init docker swarm init 跨网段_服务发现_07

  ②、部署一个服务用于测试,挂载到同一个overlay网络 

docker service create --name util --network myapp  busybox sleep 10000000

docker swarm init docker swarm init 跨网段_docker swarm init_08

 sleep 10000000的作用是保持busybox容器处于运行状态,我们才能够进入容器访问service my_web

4.验证

  可以查看到util在的节点是node2

docker swarm init docker swarm init 跨网段_80端口_09

docker swarm init docker swarm init 跨网段_80端口_10

 

 如果ping服务名ping不同 但是ping容器名、IP地址 vip的ip都可以通的情况是因为dns导致。

docker swarm init docker swarm init 跨网段_服务发现_11

我们可以看到my_web的ip为10.0.2.2 这是my_web service的vip swarm将会对vip访问负载均衡到每一个副本。

docker swarm init docker swarm init 跨网段_docker_12