docker学习笔记(七)docker-swarm
目錄
搭建Swarm環(huán)境
swarm基本操作
swarm實(shí)戰(zhàn)
docker swarm服務(wù)發(fā)布模式
docker stack
官網(wǎng):https://docs.docker.com/swarm/overview/
Docker Swarm is native clustering for Docker. It turns a pool of Docker hosts into a single, virtual Docker host.
Swarm 是 Docker 官方提供的集群管理工具,其主要作用是把若干臺(tái) Docker 主機(jī)抽象為一個(gè)整體,并且通過一個(gè)入口統(tǒng)一管理這些 Docker 主機(jī)上的各種 Docker 資源。
一個(gè) Swarm由一個(gè)或多個(gè)可以互相通信的Docker?節(jié)點(diǎn)組成.
節(jié)點(diǎn)會(huì)被分為兩類,Manager節(jié)點(diǎn)和Worker節(jié)點(diǎn)。
Manager負(fù)責(zé)控制集群,監(jiān)控集群狀態(tài)、分發(fā)任務(wù)至worker節(jié)點(diǎn)等操作;Worker節(jié)點(diǎn)則接收來自Master節(jié)點(diǎn)的任務(wù)并在其上執(zhí)行
相當(dāng)于Manager是包工頭,Worker是底層實(shí)際干活的工人。
搭建Swarm環(huán)境
這里使用的docker在線環(huán)境?https://labs.play-with-docker.com/
(1)準(zhǔn)備3臺(tái)centos7機(jī)器
? ? 192.168.0.31 (Manager)
? ? 192.168.0.32 (Worker01)
? ? 192.168.0.33?(Worker02)
(2)初始化Manager節(jié)點(diǎn)
? ? docker swarm init --advertise-addr=192.168.0.31
(3)將worker節(jié)點(diǎn)加入到集群里
查看集群狀態(tài)
(4)node類型的轉(zhuǎn)換
swarm基本操作
Service是自 Docker 1.12 后新引入的概念,僅適用于 docker swarm
Service配置的屬性和docker的容器屬性基本一致,比如容器名、端口映射、network和image. Servcie可以簡單理解為一組相同的容器副本
(1)創(chuàng)建一個(gè)tomcat的service
? ??docker service create --name my-tomcat tomcat
(2)查看當(dāng)前swarm的service
? ??docker service ls
(3)查看service的啟動(dòng)日志
? ??docker service logs my-tomcat
(4)查看service的詳情
? ??docker service inspect my-tomcat
(5)查看my-tomcat運(yùn)行在哪個(gè)node上
? ?docker service ps my-tomcat
(6)水平擴(kuò)展service
docker service scale my-tomcat=3
docker service ls
docker service ps my-tomcat
(7)如果停掉一個(gè)node的container,service會(huì)自動(dòng)幫我們維護(hù)容器副本,創(chuàng)建一個(gè)新的容器
(8)刪除service
??docker service rm my-tomcat
swarm實(shí)戰(zhàn)
單機(jī)docker中使用bridge網(wǎng)絡(luò)進(jìn)行連接通信,多機(jī)中使用的是overlay網(wǎng)絡(luò)
1)在manager節(jié)點(diǎn)創(chuàng)建一個(gè)overlay網(wǎng)絡(luò),用于docker swarm中多機(jī)通信
???docker network create -d overlay my-overlay-net
? ?docker network ls
(2)創(chuàng)建mysql和wordpress的service(Manager node)??
docker service create --name mysql --mount type=volume,source=v1,destination=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=examplepass -e MYSQL_DATABASE=db_wordpress --network my-overlay-net mysql:5.6docker service create --name wordpress -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=examplepass -e?WORDPRESS_DB_HOST=mysql:3306 -e?WORDPRESS_DB_NAME=db_wordpress -p 8080:80 --network my-overlay-net wordpress? 運(yùn)行成功
? ? ? ??
通過各個(gè)node的ip:8080都能訪問成功(這里我通過play-with-docker open port訪問8080端口)
?
這里的wordpress連接mysql是通過服務(wù)名mysql來連接的,說明其中一定有dns解析,會(huì)根據(jù)serviceName查找到對(duì)應(yīng)的ip,進(jìn)行連接,這樣在部署(擴(kuò)容)的時(shí)候就無需關(guān)心容器的ip怎么變化
For most situations, you should connect to the service name, which is load-balanced and handled by all containers (“tasks”) backing the service .
docker swarm服務(wù)發(fā)布模式
Docker Swarm 支持兩種服務(wù)發(fā)布模式:Ingress模式(默認(rèn)),Host模式。
通過 Ingress 模式發(fā)布的服務(wù),可以保證從 Swarm 集群內(nèi)任一節(jié)點(diǎn)(即使沒有運(yùn)行服務(wù)的節(jié)點(diǎn))都能訪問該服務(wù);以 Host 模式發(fā)布的服務(wù)只能通過運(yùn)行服務(wù)副本的節(jié)點(diǎn)來訪問。下圖展示了兩種模式的區(qū)別。
想要進(jìn)一步了解ingress和服務(wù)發(fā)現(xiàn)的底層可以閱讀以下文章:
https://www.jianshu.com/p/c83a9173459f
https://www.cnblogs.com/zonehoo/p/11401930.html
(1)單機(jī)部署一個(gè)tomcat service,各個(gè)集群node都可以訪問到
[node3] (local) root@192.168.0.61 ~ $ docker service create --name tomcat -p 8080:8080 --network my-overlay-net tomcat fywyxuvpbpurt3ha0pkq4wwyu overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged [node3] (local) root@192.168.0.61 ~ $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS fywyxuvpbpur tomcat replicated 1/1 tomcat:latest *:8080->8080/tcp $ docker service ps tomcat ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 8pjqve65ebww tomcat.1 tomcat:latest node1 Running Running 40 seconds ago #該tomcat容器實(shí)際部署再node1上,container為4fa7 [node1] (local) root@192.168.0.63 ~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4fa7f6681778 tomcat:latest "catalina.sh run" 5 minutes ago Up 5 minutes 8080/tcp tomcat.1.8pjqve65ebwwi3adp53eb3xbg其他node節(jié)點(diǎn)都能通過訪問本地的8080端口訪問到該tomcat
(2)部署多副本的whoami service,可以通過serviceName進(jìn)行負(fù)載均衡
[node3] (local) root@192.168.0.61 ~ $ docker service create --name whoami -p 8000:8000 --network my-overlay-net -d jwilder/whoami k1d6tus51sirz9xd4elgz2xvm [node3] (local) root@192.168.0.61 ~ $ docker service ps whoami ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 8kaudc0xvpdm whoami.1 jwilder/whoami:latest node3 Running Running 10 seconds ago [node3] (local) root@192.168.0.61 ~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cb723685302a jwilder/whoami:latest "/app/http" 48 seconds ago Up 47 seconds 8000/tcp whoami.1.8kaudc0xvpdmax2k12nf7h6m5#不同節(jié)點(diǎn)上的tomcat,whomi服務(wù),可以容器內(nèi)通過serviceName ping通 [node3] (local) root@192.168.0.61 ~ $ docker exec -it cb72368 ping tomcat PING tomcat (10.0.0.2): 56 data bytes 64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.117 ms 64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.093 ms 64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.097 ms $ docker exec -it 4fa7 ping whoami PING whoami (10.0.0.5) 56(84) bytes of data. 64 bytes from 10.0.0.5 (10.0.0.5): icmp_seq=1 ttl=64 time=0.137 ms 64 bytes from 10.0.0.5 (10.0.0.5): icmp_seq=2 ttl=64 time=0.052 ms 64 bytes from 10.0.0.5 (10.0.0.5): icmp_seq=3 ttl=64 time=0.061 ms#擴(kuò)容成3個(gè)副本,通過whoami:8000訪問,返回不同的hostid [node3] (local) root@192.168.0.61 ~ $ docker service scale whoami=3 whoami scaled to 3 overall progress: 3 out of 3 tasks 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service converged [node3] (local) root@192.168.0.61 ~ $ docker service ps whoami ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 8kaudc0xvpdm whoami.1 jwilder/whoami:latest node3 Running Running 3 minutes ago 4jv21432xgqo whoami.2 jwilder/whoami:latest node2 Running Running 8 seconds ago svg62zqee2g1 whoami.3 jwilder/whoami:latest node1 Running Running 8 seconds ago [node1] (local) root@192.168.0.63 ~ $ docker exec -it 4fa7 curl whoami:8000 I'm bca5e1a05a00 [node1] (local) root@192.168.0.63 ~ $ docker exec -it 4fa7 curl whoami:8000 I'm 6f25815a733c [node1] (local) root@192.168.0.63 ~ $ docker exec -it 4fa7 curl whoami:8000 I'm cb723685302a [node1] (local) root@192.168.0.63 ~ $ docker exec -it 4fa7 curl whoami:8000 I'm bca5e1a05a00?
service對(duì)其他服務(wù)提供了一個(gè)統(tǒng)一的VIP入口,接收其他服務(wù)訪問時(shí)會(huì)做負(fù)載均衡。
最好再畫一張圖。
docker stack
在docker中有docker-compose幫助簡化部署操作,docker swarm中也可以使用docker stack來進(jìn)行部署管理servcie
具體的定義方式跟compose差不多,這里就不一一解釋了
(1)新建service.yml文件
(2)根據(jù)service.yml創(chuàng)建service
? ??docker statck deploy -c service.yml? my-service
(3)常見操作
? ?查看stack具體信息
? ?docker stack ls
? ?查看具體的service
? ?docker stack services my-service
成功訪問
?
總結(jié)
以上是生活随笔為你收集整理的docker学习笔记(七)docker-swarm的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker学习笔记(五)docker实
- 下一篇: 分布式一致性算法Raft简介(上)