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)
如何建立swarm叢集
swarm node節點的分配是預設隨機,起初我們是不知道的
docker swarm --help #檢視幫助
docker swarm init --advertise-addr=198.168.205.10 #初始化一個docker swarm manager
docker node ls
複製程式碼
- 第一臺機器,執行命令設定為主節點
- 第二臺機器,執行上圖中倒數第二段的命令
- 然後回到第一臺manager機器檢視一下當前節點
- 剩下的幾臺機器依次執行同樣的命令
- 再次檢視第一臺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
複製程式碼
- 舉例: 執行命令
docker service create --name demo busybox sh -c"while true;do sleep 3600;done"
- 執行命令
docker service ls
檢視,REPLICAS表示水平擴充套件 - 執行命令
docker service ps demo
NODE顯示node3表示demo service在我們的第三臺機器上 - 執行命令
docker service scale=5
,水平擴充套件5個相同的服務,此時REPLICAS是5/5,5/5是什麼意思呢,第一個5是表示有多少個是ready(準備),第二個5是有多少個scheuld(分片例項 - 執行命令
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
複製程式碼
- 執行命令
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
- 檢視service mysql部署情況
3.執行命令
docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST=mysql --network demo wordpress
- 執行命令
docker service ps wordpress
,docker ps
檢視wordpress部署情況
swarm 底層機制會同步網路的建立,因為它要實現多個節點之間容器的通訊。
swarm叢集服務間通訊
-
docker network create -d overlay demo
建立名為demo的docker network -
執行命令
docker service create --name whoami -p 8000:8000 --network demo -d jwilder/whoami
-
執行命令
docker service ls
,docker service ps whoami
檢視,可以看出service在當前機器上 -
執行命令
curl 127.0.0.1:8000
,結果返回了host name -
執行命令
docker service create --name client -d --network demo busybox sh -c "while true;do sleep 4600;done"
-
執行命令
docker service ls
,docker service ps client
檢視,可以看出service在另一臺機器上 -
檢視並進入service client
-
看到可以ping通whoami主機地址,但是主機地址顯示10.0.0.7,很顯然這不是真是的ip地址
-
進入service whoami機器執行
docker service scale whoami=2
,橫向擴充套件2個 -
再次重複第7、8步,還是同樣的結果,其實這個一個vip(虛擬IP),可以使用
在部署了service whoami的機器上執行nslookup
命令檢視DNSdocker 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進行負載均衡
- 使用之前的例子service whoami,NODE分別在swarm-manager、swarm-manager2兩臺機器上
- 可以發現每次都會返回不同的host name,負載均衡
- 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的資料包走向詳情