Docker 多容器編排Swarm(六)

著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

docker swarm簡介

Docker Swarm 和 Docker Compose 同樣,都是 Docker 官方容器編排項目,但不一樣的是,Docker Compose 是一個在單個服務器或主機上建立多個容器的工具,而 Docker Swarm 則能夠在多個服務器或主機上建立容器集羣服務,對於微服務的部署,顯然 Docker Swarm 會更加適合。node

從 Docker 1.12.0 版本開始,Docker Swarm 已經包含在 Docker 引擎中(docker swarm),而且已經內置了服務發現工具,咱們就不須要像以前同樣,再配置 Etcd 或者 Consul 來進行服務發現配置了。mysql

docker swarm 體系結構如如所示:
一個Manager下面有多個Worker(實際運行中每一個都是一個container) nginx

下圖是一個Service和Replicas(複製品)模型圖, service是nginx,可是下面有3個replicas nginx構成了一個集羣

如何建立swarm集羣

swarm node節點的分配是默認隨機,起初咱們是不知道的sql

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再次查看詳情。docker

實戰-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 底層機制會同步網絡的建立,由於它要實現多個節點之間容器的通訊。bash

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 curl

  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. 再次重複第七、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的數據包走向詳情

相關文章
相關標籤/搜索