docker学习笔记(七)docker-swarm
目錄
搭建Swarm環境
swarm基本操作
swarm實戰
docker swarm服務發布模式
docker stack
官網: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 官方提供的集群管理工具,其主要作用是把若干臺 Docker 主機抽象為一個整體,并且通過一個入口統一管理這些 Docker 主機上的各種 Docker 資源。
一個 Swarm由一個或多個可以互相通信的Docker?節點組成.
節點會被分為兩類,Manager節點和Worker節點。
Manager負責控制集群,監控集群狀態、分發任務至worker節點等操作;Worker節點則接收來自Master節點的任務并在其上執行
相當于Manager是包工頭,Worker是底層實際干活的工人。
搭建Swarm環境
這里使用的docker在線環境?https://labs.play-with-docker.com/
(1)準備3臺centos7機器
? ? 192.168.0.31 (Manager)
? ? 192.168.0.32 (Worker01)
? ? 192.168.0.33?(Worker02)
(2)初始化Manager節點
? ? docker swarm init --advertise-addr=192.168.0.31
(3)將worker節點加入到集群里
查看集群狀態
(4)node類型的轉換
swarm基本操作
Service是自 Docker 1.12 后新引入的概念,僅適用于 docker swarm
Service配置的屬性和docker的容器屬性基本一致,比如容器名、端口映射、network和image. Servcie可以簡單理解為一組相同的容器副本
(1)創建一個tomcat的service
? ??docker service create --name my-tomcat tomcat
(2)查看當前swarm的service
? ??docker service ls
(3)查看service的啟動日志
? ??docker service logs my-tomcat
(4)查看service的詳情
? ??docker service inspect my-tomcat
(5)查看my-tomcat運行在哪個node上
? ?docker service ps my-tomcat
(6)水平擴展service
docker service scale my-tomcat=3
docker service ls
docker service ps my-tomcat
(7)如果停掉一個node的container,service會自動幫我們維護容器副本,創建一個新的容器
(8)刪除service
??docker service rm my-tomcat
swarm實戰
單機docker中使用bridge網絡進行連接通信,多機中使用的是overlay網絡
1)在manager節點創建一個overlay網絡,用于docker swarm中多機通信
???docker network create -d overlay my-overlay-net
? ?docker network ls
(2)創建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? 運行成功
? ? ? ??
通過各個node的ip:8080都能訪問成功(這里我通過play-with-docker open port訪問8080端口)
?
這里的wordpress連接mysql是通過服務名mysql來連接的,說明其中一定有dns解析,會根據serviceName查找到對應的ip,進行連接,這樣在部署(擴容)的時候就無需關心容器的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服務發布模式
Docker Swarm 支持兩種服務發布模式:Ingress模式(默認),Host模式。
通過 Ingress 模式發布的服務,可以保證從 Swarm 集群內任一節點(即使沒有運行服務的節點)都能訪問該服務;以 Host 模式發布的服務只能通過運行服務副本的節點來訪問。下圖展示了兩種模式的區別。
想要進一步了解ingress和服務發現的底層可以閱讀以下文章:
https://www.jianshu.com/p/c83a9173459f
https://www.cnblogs.com/zonehoo/p/11401930.html
(1)單機部署一個tomcat service,各個集群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容器實際部署再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節點都能通過訪問本地的8080端口訪問到該tomcat
(2)部署多副本的whoami service,可以通過serviceName進行負載均衡
[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#不同節點上的tomcat,whomi服務,可以容器內通過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#擴容成3個副本,通過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對其他服務提供了一個統一的VIP入口,接收其他服務訪問時會做負載均衡。
最好再畫一張圖。
docker stack
在docker中有docker-compose幫助簡化部署操作,docker swarm中也可以使用docker stack來進行部署管理servcie
具體的定義方式跟compose差不多,這里就不一一解釋了
(1)新建service.yml文件
(2)根據service.yml創建service
? ??docker statck deploy -c service.yml? my-service
(3)常見操作
? ?查看stack具體信息
? ?docker stack ls
? ?查看具體的service
? ?docker stack services my-service
成功訪問
?
總結
以上是生活随笔為你收集整理的docker学习笔记(七)docker-swarm的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker学习笔记(五)docker实
- 下一篇: 分布式一致性算法Raft简介(上)