Docker 多容器編排Swarm(六)

蔣老溼發表於2018-11-08

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)

Docker 多容器編排Swarm(六)
下圖是一個Service和Replicas(複製品)模型圖, service是nginx,但是下面有3個replicas nginx構成了一個叢集
Docker 多容器編排Swarm(六)

如何建立swarm叢集

swarm node節點的分配是預設隨機,起初我們是不知道的

docker swarm --help     #檢視幫助
docker swarm init --advertise-addr=198.168.205.10  #初始化一個docker swarm manager
docker node ls
複製程式碼
  1. 第一臺機器,執行命令設定為主節點
    Docker 多容器編排Swarm(六)
  2. 第二臺機器,執行上圖中倒數第二段的命令
    Docker 多容器編排Swarm(六)
  3. 然後回到第一臺manager機器檢視一下當前節點
    Docker 多容器編排Swarm(六)
  4. 剩下的幾臺機器依次執行同樣的命令
    Docker 多容器編排Swarm(六)
  5. 再次檢視第一臺manager機器,會發現已經有3個docker swarm node
    Docker 多容器編排Swarm(六)
    至此,一個簡單的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"
    Docker 多容器編排Swarm(六)
  2. 執行命令docker service ls檢視,REPLICAS表示水平擴充套件
    Docker 多容器編排Swarm(六)
  3. 執行命令docker service ps demoNODE顯示node3表示demo service在我們的第三臺機器上
    Docker 多容器編排Swarm(六)
  4. 執行命令docker service scale=5,水平擴充套件5個相同的服務,此時REPLICAS是5/5,5/5是什麼意思呢,第一個5是表示有多少個是ready(準備),第二個5是有多少個scheuld(分片例項
    Docker 多容器編排Swarm(六)
  5. 執行命令docker service ps demo可以看到該servie所有部署情況
    Docker 多容器編排Swarm(六)

第一臺機器,也就是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
    Docker 多容器編排Swarm(六)
  2. 檢視service mysql部署情況
    Docker 多容器編排Swarm(六)
    3.執行命令docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST=mysql --network demo wordpress
    Docker 多容器編排Swarm(六)
  3. 執行命令docker service ps wordpressdocker ps檢視wordpress部署情況
    Docker 多容器編排Swarm(六)

swarm 底層機制會同步網路的建立,因為它要實現多個節點之間容器的通訊。

swarm叢集服務間通訊

Docker 多容器編排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

    Docker 多容器編排Swarm(六)

  3. 執行命令docker service lsdocker service ps whoami檢視,可以看出service在當前機器上

    Docker 多容器編排Swarm(六)

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

    Docker 多容器編排Swarm(六)

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

    Docker 多容器編排Swarm(六)

  6. 執行命令docker service lsdocker service ps client檢視,可以看出service在另一臺機器上

    Docker 多容器編排Swarm(六)

  7. 檢視並進入service client

    Docker 多容器編排Swarm(六)

  8. 看到可以ping通whoami主機地址,但是主機地址顯示10.0.0.7,很顯然這不是真是的ip地址

    Docker 多容器編排Swarm(六)

  9. 進入service whoami機器執行docker service scale whoami=2,橫向擴充套件2個

    Docker 多容器編排Swarm(六)

  10. 再次重複第7、8步,還是同樣的結果,其實這個一個vip(虛擬IP),可以使用nslookup命令檢視DNS

    Docker 多容器編排Swarm(六)
    Docker 多容器編排Swarm(六)
    在部署了service whoami的機器上執行docker exec [containerID] ip a檢視對應的容器IP地址,即可知道真實IP,VIP(虛擬IP)不會經常變動,機器IP可能變動

此時多次執行命令curl 127.0.0.1:8000,會發現每次返回的host name可能會變,這是因為已經提供了負載均衡功能了。

Internal Load Balancing 圖:

Docker 多容器編排Swarm(六)
DNS+VIP+iptables+LVS

Docker 多容器編排Swarm(六)
Routing Mesh的兩種體現

  • Internal——Container和Container之間的訪問通過overlay網路(通過VIP虛擬ip)
  • Ingress——如果服務有繫結介面,則此服務可以通過任意swarm節點的相應介面訪問

上述的操作分別採用了這2種方式

Ingress負載均衡

  • 外部訪問的負載均衡
  • 服務埠被暴露到各個swarm節點
  • 內部通過IPVS進行負載均衡
    Docker 多容器編排Swarm(六)
  1. 使用之前的例子service whoami,NODE分別在swarm-manager、swarm-manager2兩臺機器上
    Docker 多容器編排Swarm(六)
  2. 可以發現每次都會返回不同的host name,負載均衡
    Docker 多容器編排Swarm(六)
  3. swarm-manager1沒有service whoami,也能訪問
    Docker 多容器編排Swarm(六)

swarm-manager1執行sudo iptables -nL -t nat檢視轉發規則

Docker 多容器編排Swarm(六)
執行ip a可以看出在同一網段
Docker 多容器編排Swarm(六)
2. brctl show
Docker 多容器編排Swarm(六)
3. docker network ls docker network inspect docker_gwbridge
Docker 多容器編排Swarm(六)
4. docker_gwbridge 具體內容
Docker 多容器編排Swarm(六)
5. sudo ls /var/run/docker/netns sudo nsenter --net=/var/run/docker/netns/ingress_sbox
Docker 多容器編排Swarm(六)
6. iptables -nL -t mangle,白色處具體是做負載均衡的
Docker 多容器編排Swarm(六)
7. 下載LVS管理工具,yum install ipvsadm 8. 再次進入root,執行ipvsadm -l
Docker 多容器編排Swarm(六)
Ingress Network的資料包走向詳情
Docker 多容器編排Swarm(六)

相關文章