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
swarm node節點的分配是默認隨機,起初咱們是不知道的sql
docker swarm --help #查看幫助
docker swarm init --advertise-addr=198.168.205.10 #初始化一個docker swarm manager
docker node ls
複製代碼
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
再次查看詳情。docker
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
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 底層機制會同步網絡的建立,由於它要實現多個節點之間容器的通訊。bash
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 curl
執行命令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個
再次重複第七、8步,仍是一樣的結果,其實這個一個vip(虛擬IP),可使用nslookup
命令查看DNS
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的兩種體現上述的操做分別採用了這2種方式
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的數據包走向詳情