您好,登錄后才能下訂單哦!
Swarm是Docker公司推出的用來管理docker集群的平臺,幾乎全部用GO語言來完成的開發的,代碼開源在https://github.com/docker/swarm, 它是將一群Docker宿主機變成一個單一的虛擬主機,Swarm使用標準的Docker API接口作為其前端的訪問入口,換言之,各種形式的Docker
Client(compose,docker-py等)均可以直接與Swarm通信,甚至Docker本身都可以很容易的與Swarm集成,這大大方便了用戶將原本基于單節點的系統移植到Swarm上,同時Swarm內置了對Docker網絡插件的支持,用戶也很容易的部署跨主機的容器集群服務。
Swarm的基本架構如下圖所示:
任何規模都有高性能表現 對于企業級的 Docker Engine 集群和容器調度而言,可拓展性是關鍵。任何規模的公司——不論是擁有五個還是上千個服務器——都能在其環境下有效使用 Swarm。 經過測試,Swarm 可拓展性的極限是在 1000 個節點上運行 50000 個部署容器,每個容器的啟動時間為亞秒級,同時性能無減損。
靈活的容器調度
Swarm 幫助 IT 運維團隊在有限條件下將性能表現和資源利用最優化。Swarm 的內置調度器(scheduler)支持多種過濾器,包括:節點標簽,親和性和多種容器部策略如 binpack、spread、random 等等。
服務的持續可用性
Docker Swarm 由 Swarm Manager 提供高可用性,通過創建多個 Swarm master 節點和制定主 master 節點宕機時的備選策略。如果一個 master 節點宕機,那么一個 slave 節點就會被升格為 master 節點,直到原來的 master 節點恢復正常。 此外,如果某個節點無法加入集群,Swarm 會繼續嘗試加入,并提供錯誤警報和日志。在節點出錯時,Swarm 現在可以嘗試把容器重新調度到正常的節點上去。
和 Docker API 及整合支持的兼容性
Swarm 對 Docker API 完全支持,這意味著它能為使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用戶提供無縫銜接的使用體驗。
Docker Swarm 為 Docker 化應用的核心功能(諸如多主機網絡和存儲卷管理)提供原生支持
開發的 Compose 文件能(通過 docker-compose up )輕易地部署到測試服務器或 Swarm 集群上。Docker Swarm 還可以從 Docker Trusted Registry 或 Hub 里 pull 并 run 鏡像。
主機 | IP地址 | 服務 |
---|---|---|
docker01 | 192.168.1.11 | swarm+service+webUI+registry |
docker02 | 192.168.1.13 | docker |
docker03 | 192.168.1.20 | docker |
三臺主機都關閉防火墻,禁用selinux,修改主機名,時間同步,并添加域名解析。
docker版本必須是:v1.12版本開始(可使用docker version查看版本)
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# hostnamectl set-hostname docker03
[root@localhost ~]# su -
mv /etc/localtime /etc/localtime.bk
cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime
[root@localhost ~]# hostnamectl set-hostname docker01
[root@localhost ~]# su -
[root@docker01 ~]# echo 192.168.1.11 docker01 >> /etc/hosts
[root@docker01 ~]# echo 192.168.1.13 docker02 >> /etc/hosts
[root@docker01 ~]# echo 192.168.1.20 docker03 >> /etc/hosts
[root@docker01 ~]# docker swarm init --advertise-addr 192.168.1.11
--advertise-addr:指定與其它docker通信的地址。
上邊返回的結果告訴我們:初始化成功,并且,如果想要添加work節點運行下面的命令:
注意:token令牌只有24小時的有效期
如果想要添加manager節點:運行下面命令
[root@docker03 ~]# docker swarm join --token SWMTKN-1-5kxn9wloh7npnytklwbfciesr9di7uvu521gwnqm9h2n0pbokj-1e60wt0yr5583e4mzwbxnn3a8 192.168.1.11:2377
[root@docker01 ~]# docker node ls
*注意:這里的”****“代表的是當前所屬的節點
[root@docker01 ~]# docker node update docker01 --availability drain
設置主機docker01以后不運行容器,但已經運行的容器并不會停止
“--availability”選項后面共有三個選項可配置,如下:
“active”:工作;“pause”:暫時不工作;“drain”:永久性的不工作
[root@docker01 ~]# docker node ls
[root@docker01~]# docker pull dockersamples/visualizer
[root@docker01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.100 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualiaer dockersamples/visualizer
如果訪問不到網頁,需開啟路由轉發
[root@docker01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@docker01 ~]# sysctl -p
72 docker pull registry
//下載registry鏡像
73 docker run -itd --name registry -p 5000:5000 --restart=always registry:latest
//基于registry鏡像,啟動一臺容器
78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000
80 systemctl daemon-reload
81 systemctl restart docker.service
//重啟docker
76 docker tag busybox:latest 192.168.1.11:5000/busybox:v1
//把容器重命名一個標簽
77 docker ps
78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000
80 systemctl daemon-reload
81 systemctl restart docker.service
//重啟docker
100 docker push 192.168.1.11:5000/busybox:v1
//上傳容器到私有倉庫
78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000
80 systemctl daemon-reload
81 systemctl restart docker.service
//重啟docker
99 docker pull 192.168.1.11/busybox:v1
//測試下載
[root@docker01 ~]# docker pull httpd
//下載httpd鏡像
創建三個測試目錄
[root@docker01 ~]# mkdir {v1,v2,v3}
//創建測試目錄
docker01,v1目錄操作
[root@docker01 ~]# cd v1
[root@docker01 v1]# echo v1,xgp666 > index.html
//創建測試網頁
[root@docker01 v1]# vim Dockerfile
//編寫Dockerfile
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html
[root@docker01 v1]# docker build -t 192.168.1.11:5000/httpd:v1 .
//基于dockerfile創建鏡像
[root@docker01 v1]# docker push 192.168.1.11:5000/httpd:v1
//上傳剛剛創建鏡像到私有倉庫
docker01,v2目錄操作
[root@docker01 v1]# cd ../v2
[root@docker01 v2]# echo v2,xgp666 > index.html
[root@docker01 v2]# vim Dockerfile
//編寫Dockerfile
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html
[root@docker01 v2]# docker build -t 192.168.1.11:5000/httpd:v2 .
//基于dockerfile創建鏡像
[root@docker01 v2]# docker push 192.168.1.11:5000/httpd:v2
//上傳剛剛創建鏡像到私有倉庫
docker01,v3目錄操作
[root@docker01 v1]# cd ../v3
[root@docker01 v2]# echo v3,xgp666 > index.html
[root@docker01 v2]# vim Dockerfile
//編寫Dockerfile
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html
[root@docker01 v2]# docker build -t 192.168.1.11:5000/httpd:v3 .
//基于dockerfile創建鏡像
[root@docker01 v2]# docker push 192.168.1.11:5000/httpd:v3
//上傳剛剛創建鏡像到私有倉庫
[root@docker01 v3]# docker service create --replicas 3 --name bdqn -p 80:80 192.168.1.11:5000/httpd:v1
查看一下網絡
[root@docker03 ~]# docker network ls
默認的Ingress網絡,包括創建的自定義overlay網絡, 為后端真正為用戶提供服務的container,提供了一個統一的入口。
service 通過 ingress load balancing 來發布服務,且 swarm 集群中所有 node 都參與到 ingress 路由網格(ingress routing mesh) 中,訪問任意一個 node+PublishedPort 即可訪問到服務。
當訪問任何節點上的端口80時,Docker將您的請求路由到活動容器。在群節點本身,端口80可能并不實際綁定,但路由網格知道如何路由流量,并防止任何端口沖突的發生。
路由網格在發布的端口上監聽分配給節點的任何IP地址。對于外部可路由的IP地址,該端口可從主機外部獲得。對于所有其他IP地址,只能從主機內部訪問。
[root@docker01 v3]# docker service ps bdqn
[root@docker02 ~]# docker exec -it 388f3bd9dd33 /bin/bash
root@388f3bd9dd33:/usr/local/apache2# cd htdocs/
root@388f3bd9dd33:/usr/local/apache2/htdocs# echo 123 > index.html
[root@docker03 ~]# docker exec -it 281454867fac /bin/bash
root@281454867fac:/usr/local/apache2# echo 321 > htdocs/index.html
[root@docker01 v3]# docker service create --replicas 3 --name test -p 80 192.168.1.11:5000/httpd:v1
[root@docker01 v3]# docker service ls
默認映射端口30000-32767
[root@docker01 v3]# docker service scale bdqn=6
[root@docker01 v3]# docker service scale bdqn=4
擴容與縮容直接直接通過scale進行設置副本數量。
docker service upadte 命令參數詳解
--force 強制更新重啟服務,無論是否配置或鏡像改變都更新
--image <image:tag> 制定更新的鏡像
--with-registry-auth 向 Swarm 代理發送 Registry 認證詳細信息,私有倉庫需要攜帶該參數
[root@docker01 ~]# docker service update --image 192.168.1.11:5000/httpd:v2 bdqn
//把bdqn服務升級成v2的版本
[root@docker01 ~]# docker service update --image 192.168.1.11:5000/httpd:v3 --update-parallelism 2 --update-delay 1m bdqn
//兩個服務一起更新,然后,隔一分鐘,繼續更新
默認情況下, swarm-次只更新-個副本,并且兩個副本之間沒有等待時間,我們可以通過
--update-parallelism;設置并行更新的副本數量。
--update-delay:指定滾動更新的時間間隔。
[root@docker01 ~]# docker service rollback bdqn
注意,docker swarm的回滾操作,默認只能回滾到上一-次操作的狀態,并不能連續回滾到指定操作。
如果一臺機器啟用多個服務注意,合理分配cpu與內存資源,因tomcat在啟動編譯時會很吃內存,且docker是多線程啟動的,所有最好是限定一下(設置resources.limits)否者會導致內存在同一時刻用光,某些服務啟動失敗當然也可是設置出錯重啟(restart_policy.condition:on-failure),另外設置resources.reservations要注意,不要超出總內存或cpu百分比,否者會導致后面服務無法獲取cpu或內存資源出現“no suitable node (insufficien”錯誤(這個錯誤很奇怪,某個service不啟動,也不輸出日志,使用“docker stack ps [xxxx]”查看狀態會顯示此錯誤)無法啟動
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。