前言
之前在總結docker machine的時候,當時對docker理解還不夠深入,甚至還不知道 docker machine 與 docker swarm 的區別。
在查閱資料以及官方文檔之后,今天基本徹底搞明白了。其實 docker machine 只是一個docker多節點的管理工具,它的作用是幫助我們在其他節點上安裝docker、運行docker容器等;而 docker swarm 則是一個docker集群管理工具,有了它整個集群就能協同工作,從容器的角度來說有點像是openstack的感覺,能夠直接管理整個集群,從分布式的角度來說有點像是hadoop,當然只是從分布式的這個角度來考慮。
本文為大家簡單介紹 docker swarm 下的跨主機通信以及最強大的 docker swarm 集群管理功能。
一、docker swarm 安裝
1.1 docker machine 創建節點
此處也能體現 docker machine 與 docker swarm 的區別,簡單來說docker machine是為 docker swarm 服務的。
先使用 docker-machine 創建三個docker節點。
docker-machine create -d generic --generic-ip-address <ip> <name>
在docker-machine主節點執行三次上述操作,其中ip為要創建的主機的ip地址,name為給想要創建的主機重命名的host名稱。此處假設分別為swarm-manager、swarm-node1、swarm-node2,很明顯我們選擇swarm-manager為manager節點(下文詳細講解)。
1.2 創建 swarm 集群
docker swarm 分為manager節點和worker節點,顯然manager節點相當於主節點,能夠管理所有worker節點。
創建 manager 節點
在上述創建好的三個docker節點中選擇一個作為manager節點(上文已經選擇了swarm-manager節點),在docker-machine節點上執行下述操作:
docker-machine ssh swarm-manager "docker swarm init"
執行上述操作,會提示你創建成功,並給出一個創建worker節點的命令,其中會包含token等信息,token是manager節點識別子節點的標識。
創建worker節點
同樣,在docker-machine中執行下述操作:
docker-machine ssh swarm-node1 "docker swarm join --token <token> <ip>:2377"
docker-machine ssh swarm-node2 "docker swarm join --token <token> <ip>:2377"
其中
都執行完就可以在manager節點中執行下述命令查看所有集群中所有節點:
docker node ls
此命令會列出集群中所有節點,並給出各個節點的角色。當然此處你也可以通過docker-machine以ssh的方式執行,下同。
二、docker swarm 跨主機通信
swarm 跨主機通信同樣需要overlay網絡(或者其他幾個選項,還未測試)。但是與之前講述不同的是swarm不需要consul服務,其實是swarm提供了consul的功能,相當於簡化了跨主機通信的操作。
在manager節點執行下述命令創建overlay網絡:
docker network create -d overlay --attachable my_net
此處必須要添加--attachable參數,否則不能用於容器。
在主節點上創建overlay網絡之后,worker節點並不像采用consul的方案那樣能夠自動識別到該網絡,但是可以通過--network my_net
的方式在創建容器的時候使用該網絡,當在worker節點按上述方式運行容器並使用該網絡之后,即可通過docker network ls在此worker節點上查看到該網絡。
這樣所有使用該網絡的節點均可進行通信。同樣通過brctl show 命令可以看到節點生成了一個docker_gwbridge網橋,並且下面掛載了相應的vethxxx,這與之前分析的相同,是overlay網絡的工作原理。
三、docker swarm 集群管理——部署應用
這是docker swarm強大之處,通過它能夠直接實現負載均衡、主備、容災等功能。它可以自動創建一個應用,應用包含一系列的服務,每一個服務簡單的說是一個鏡像創建幾個容器,這些容器集合起來能夠實現某些特定的功能,並且無需用戶指定這些容器運行在哪些節點上,swarm會自動分配,甚至會在不同的節點上跳轉,當某worker節點掛掉的時候其上運行的所有容器也會自動遷移到其他節點上。
說了這么多好處,下面詳細介紹一下如何發布一個服務。
3.1 創建配置文件
首先創建一個配置文件,其內包含了該應用的所有信息,包含需要的服務,每一個服務使用的鏡像、創建的容器個數、端口映射、存儲映射、網絡等等,基本上是前面所介紹的容器信息的集合。
其配置文件采用YAML格式,YAML是專門用來寫配置文件的語言,非常簡潔。YAML基本規則如下:
- 大小寫敏感。
- 使用縮進表示層級關系。
- 進時不允許使用Tab鍵,只允許使用空格。
- 縮進的空格數目不重要,只要相同層級的元素左側對齊即可。
- # 表示注釋,從這個字符一直到行尾,都會被解析器忽略。
YAML詳細規則可以參考http://www.ruanyifeng.com/blog/2016/07/yaml.html?f=tt
swarm應用基本模板如下:
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:
ipam:
config:
- subnet: 172.19.0.0/24
其中version: "3"表示使用第三版,每個版本配置規則不同,services項下面有web和visualizer兩項(此處名稱可以任取,只要自己清楚就行),表示應用有兩個服務,每個服務下面是使用的鏡像以及端口映射、存儲映射、網絡等信息。重點看一下deploy項,replicas表示運行容器運行的個數,restart_policy表示重啟策略,resources下是容器的運行資源,limits是運行限制,包含cpu、內存等限制,cpus值為"0.1"表示所有cpu的百分之十,constraints: [node.role == manager]表示該容器只部署在manager節點上。每個service下面的networks可以有多個,但是必須都包含在頂級的networks中,頂級networks中也可以包含多個網絡,每一個可以不進行任何設置,可以采用上述方式進行設置,最終swarm會創建一個appname_webnet的網絡,此處webnet的名字也可以任取,appname是將要創建的服務的名稱,在下面會介紹。
將上述配置文件保存到docker-compose.yml文件中,待用。
3.2 部署應用
通過運行以下命令部署應用:
docker stack deploy -c docker-compose.yml <appname>
其中appname為應用的名稱。這樣我們就成功部署了一個應用,里面包含三個服務。
訪問swarm集群下的任何一個ip地址的上述端口,swarm都會將其隨機轉發到stack下的任何一個container,這樣就可以起到負載均衡、容災、主備等功能。
3.3 docker stack 常用命令
docker stack ls
查看部署的所有應用,可以查看到應用名稱及包含的服務個數。
docker stack deploy
docker stack deploy -c <composefile> <appname>
上面介紹過的部署應用。
docker stack services
docker stack services <appname>
查看某個應用中的服務具體信息。
docker stack ps
docker stack ps <appname>
查看某個應用的具體信息,包含每個容器的配置以及運行在哪個節點等。
docker stack rm
docker stack rm <appname>
刪除某個應用。
四、總結
本文簡單介紹了docker swarm以及其安裝、部署應用及docker stack相關操作。可以看出swarm功能很強大,基本等同於一個小的openstack,后續會繼續深入學習。