Python中国社区  »  docker

Docker 多容器编排Swarm(六)

蒋老湿 • 2 周前 • 18 次点击  
阅读 25

Docker 多容器编排Swarm(六)

docker swarm简介

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。

docker swarm 体系结构如如所示:
一个Manager下面有多个Worker(实际运行中每个都是一个container)

下图是一个Service和Replicas(复制品)模型图, service是nginx,但是下面有3个replicas nginx构成了一个集群

如何创建swarm集群

swarm node节点的分配是默认随机,起初我们是不知道的

docker swarm --help     #查看帮助
docker swarm init --advertise-addr=198.168.205.10  #初始化一个docker swarm manager
docker node ls
复制代码
  1. 第一台机器,执行命令设置为主节点
  2. 第二台机器,执行上图中倒数第二段的命令
  3. 然后回到第一台manager机器查看一下当前节点
  4. 剩下的几台机器依次执行同样的命令
  5. 再次查看第一台manager机器,会发现已经有3个docker swarm node
    至此,一个简单的docker swarm集群创建完成

创建维护和水平扩展

docker service create --help
docker service ls   #查看所有
docker service scale #水平扩展
docker service scale [serviceName] = [num] #设置service(container)数目
docker service ps [serviceNmae]         #查看当前service详细
docker ps
复制代码
  1. 举例: 执行命令 docker service create --name demo busybox sh -c"while true;do sleep 3600;done"
  2. 执行命令docker service ls查看,REPLICAS表示水平扩展
  3. 执行命令docker service ps demoNODE显示node3表示demo service在我们的第三台机器上
  4. 执行命令docker service scale=5,水平扩展5个相同的服务,此时REPLICAS是5/5,5/5是什么意思呢,第一个5是表示有多少个是ready(准备),第二个5是有多少个scheuld(分片实例
  5. 执行命令docker service ps demo可以看到该servie所有部署情况

第一台机器,也就是Docker Swarm Manange执行docker service rm demo命令后,则以上创建的service demo 的container全部销毁,可以执行docker service ps demo, docker ps再次查看详情。

实战-swram集群里部署wordpress

docker network create -d overlay demo   #创建名为demo的docker network
docker network ls   #查看
docker exec [containerID] ip a  #查看容器ip
复制代码
  1. 执行命令docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root --env MYSQL_DATABASE=wordpress --network demo --mount type=volume,source=mysql-data,destination=/var/lib/mysql mysq
  2. 查看service mysql部署情况
    3.执行命令docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST=mysql --network demo wordpress
  3. 执行命令docker service ps wordpressdocker ps查看wordpress部署情况

swarm 底层机制会同步网络的创建,因为它要实现多个节点之间容器的通信。

swarm集群服务间通信

  1. docker network create -d overlay demo创建名为demo的docker network

  2. 执行命令docker service create --name whoami -p 8000:8000 --network demo -d jwilder/whoami

  3. 执行命令docker service lsdocker service ps whoami查看,可以看出service在当前机器上

  4. 执行命令curl 127.0.0.1:8000,结果返回了host name

  5. 执行命令docker service create --name client -d --network demo busybox sh -c "while true;do sleep 4600;done"

  6. 执行命令docker service lsdocker service ps client查看,可以看出service在另一台机器上

  7. 查看并进入service client

  8. 看到可以ping通whoami主机地址,但是主机地址显示10.0.0.7,很显然这不是真是的ip地址

  9. 进入service whoami机器执行docker service scale whoami=2,横向扩展2个

  10. 再次重复第7、8步,还是同样的结果,其实这个一个vip(虚拟IP),可以使用nslookup命令查看DNS

    在部署了service whoami的机器上执行docker exec [containerID] ip a查看对应的容器IP地址,即可知道真实IP,VIP(虚拟IP)不会经常变动,机器IP可能变动

此时多次执行命令curl 127.0.0.1:8000,会发现每次返回的host name可能会变,这是因为已经提供了负载均衡功能了。

Internal Load Balancing 图:

DNS+VIP+iptables+LVS

Routing Mesh的两种体现

  • Internal——Container和Container之间的访问通过overlay网络(通过VIP虚拟ip)
  • Ingress——如果服务有绑定接口,则此服务可以通过任意swarm节点的相应接口访问

上述的操作分别采用了这2种方式

Ingress负载均衡

  • 外部访问的负载均衡
  • 服务端口被暴露到各个swarm节点
  • 内部通过IPVS进行负载均衡
  1. 使用之前的例子service whoami,NODE分别在swarm-manager、swarm-manager2两台机器上
  2. 可以发现每次都会返回不同的host name,负载均衡
  3. swarm-manager1没有service whoami,也能访问

swarm-manager1执行sudo iptables -nL -t nat查看转发规则

执行ip a可以看出在同一网段
2. brctl show
3. docker network ls docker network inspect docker_gwbridge
4. docker_gwbridge 具体内容
5. sudo ls /var/run/docker/netns sudo nsenter --net=/var/run/docker/netns/ingress_sbox
6. iptables -nL -t mangle,白色处具体是做负载均衡的
7. 下载LVS管理工具,yum install ipvsadm 8. 再次进入root,执行ipvsadm -l
Ingress Network的数据包走向详情


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/Tbu1jEWRbM
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/26126
 
18 次点击  
分享到微博