docker-swarm簡介node
Swarm是Docker官方提供的一款集羣管理工具,其主要做用是把若干臺Docker主機抽象爲一個總體,而且經過一個入口統一管理這些Docker主機上的各類Docker資源。Swarm和Kubernetes比較相似,可是更加輕,具備的功能也較kubernetes更少一些。linux
swarm集羣提供給用戶管理集羣內全部容器的操做接口與使用一臺Docker主機基本相同。nginx
Swarm集羣目前有兩個版本:V一、V2算法
一、Swarm v1它是master-slave架構。須要經過服務發現來選舉出管理節點,其它各個節點經過運行agent來接受管理節點的統一管理sql
二、Swarm v2集羣是自動經過Raft協議分佈式選舉出管理節點,不須要配置發現服務,從而避免發現服務的單點故障問題。且它自帶了DNS負載均衡和對外部負載均衡機制的支持docker
Swarm的基本架構以下圖所示json
Swarm一些概念說明vim
一、Swarm瀏覽器
使用swarmkit嵌入docker Engine中的集羣管理和編排功能。docker容器初始化啓動的一種模式服務器
二、Node
節點,是一個已加入到docker swarm集羣中的一個容器實例。
三、Service
服務主要是在工做節點上執行任務,建立服務時,須要指定容器的鏡像。
四、Task
任務是在容器中執行的命令
Swarm 工做方式
一、節點
二、服務、任務、容器
三、任務與調度
四、服務副本與全局服務
Swarm 調度策略
Swarm在scheduler節點(leader 節點)運行容器的時候,會根據指定的策略來計算最適合運行容器的節點,目前支持的策略有:spread, binpack, random.
1)Random
顧名思義,就是隨機選擇一個 Node 來運行容器,通常用做調試用,spread 和 binpack 策略會根據各個節點的可用的 CPU, RAM 以及正在運行的容器的數量來計算應該運行容器的節點。
2)Spread
在同等條件下,Spread 策略會選擇運行容器最少的那臺節點來運行新的容器,binpack 策略會選擇運行容器最集中的那臺機器來運行新的節點。使用 Spread 策略會使得容器會均衡的分佈在集羣中的各個節點上運行,一旦一個節點掛掉了只會損失少部分的容器。
3)Binpack
Binpack 策略最大化的避免容器碎片化,就是說 binpack 策略儘量的把還未使用的節點留給須要更大空間的容器運行,儘量的把容器運行在一個節點上面。
Swarm Cluster模式的特性
1)批量建立服務
創建容器以前先建立一個 overlay 的網絡,用來保證在不一樣主機上的容器網絡互通的網絡模式
2)強大的集羣的容錯性
當容器副本中的其中某一個或某幾個節點宕機後,cluster 會根據本身的服務註冊發現機制,以及以前設定的值–replicas n,在集羣中剩餘的空閒節點上,從新拉起容器副本。整個副本遷移的過程無需人工干預,遷移後本來的集羣的 load balance 依舊好使!
不難看出,docker service 其實不只僅是批量啓動服務這麼簡單,而是在集羣中定義了一種狀態。Cluster 會持續檢測服務的健康狀態並維護集羣的高可用性。
3)服務節點的可擴展性
Swarm Cluster不光只是提供了優秀的高可用性,同時也提供了節點彈性擴展或縮減的功能。當容器組想動態擴展時,只需經過 scale參數便可複製出新的副本出來。仔細觀察的話,能夠發現全部擴展出來的容器副本都 run 在原先的節點下面,若是有需求想在每臺節點上都 run 一個相同的副本,方法其實很簡單,只須要在命令中將」–replicas n」更換成」–mode=global」便可!複製服務(–replicas n)將一系列複製任務分發至各節點當中,具體取決於您所須要的設置狀態,例如「–replicas 3」。全局服務(–mode=global)適用於集羣內所有可用節點上的服務任務,例如「–mode global」。若是你們在 Swarm 集羣中設有 7 臺 Docker 節點,則所有節點之上都將存在對應容器。
4)調度機制
所謂的調度其主要功能是 cluster 的 server 端去選擇在哪一個服務器節點上建立並啓動一個容器實例的動做。它是由一個裝箱算法和過濾器組合而成。每次經過過濾器(constraint)啓動容器的時候,swarm cluster 都會調用調度機制篩選出匹配約束條件的服務器,並在這上面運行容器。
Swarm cluster的建立過程
1)發現 Docker 集羣中的各個節點,收集節點狀態、角色信息,並監視節點狀態的變化
2)初始化內部調度(scheduler)模塊
3)建立並啓動 API 監聽服務模塊
一旦建立好這個 cluster,就能夠用命令 docker service 批量對集羣內的容器進行操做,在啓動容器後,docker 會根據當前每一個 swarm 節點的負載判斷,在負載最優的節點運行這個 task 任務,用」docker service ls」 和」docker service ps + taskID」能夠看到任務運行在哪一個節點上。容器啓動後,有時須要等待一段時間才能完成容器建立。
Swarm命令行說明
docker swarm:集羣管理
init#初始化集羣
join#將節點加入集羣
join-token#管理加入令牌
leave#從集羣中刪除某個節點,強制刪除加參數--force
update#更新集羣
unlock#解鎖集羣
docker node:節點管理,
demote#將集羣中一個或多個節點降級
inspect#顯示一個或多個節點的詳細信息
ls#列出集羣中的節點
promote#將一個或多個節點提高爲管理節點
rm#從集羣中刪除中止的節點,--force強制刪除參數
ps#列出一個或多個節點上運行的任務
update#更新節點
docker service:服務管理,
create#建立一個新的服務
inspect#列出一個或多個服務的詳細信息
ps#列出一個或多個服務中的任務信息
ls#列出服務
rm#刪除一個或多個服務
scale#擴展一個或多個服務
update#更新服務
docker stack/deploy:試驗特性,用於多應用部署
安裝佈署swarm集羣服務
一、修改主機名,配置hosts文件
[root@manager ~]# cat >>/etc/hosts<<EOF
192.168.22.177manager
192.168.22.175node1
192.168.22.178node2
EOF
[root@manager ~]# tail -3 /etc/hosts
192.168.22.177manager
192.168.22.175node1
192.168.22.178node2
[root@manager ~]# ping node1
PINGnode1(192.168.22.175) 56(84) bytes of data.
64 bytesfromnode1(192.168.22.175): icmp_seq
=1ttl=64time=3.64ms
64bytesfromnode1(192.168.22.175): icmp_seq=2ttl=64time=1.64ms
^C
--- node1 ping statistics ---
2packets transmitted,2received,0% packet loss, time1006ms
rtt min/avg/max/mdev =1.648/2.644/3.641/0.997ms
[root@manager ~]# ping node2
PINGnode2(192.168.22.178) 56(84) bytes of data.
64 bytesfromnode2(192.168.22.178): icmp_seq
=1ttl=64time=9.70ms
64bytesfromnode2(192.168.22.178): icmp_seq=2ttl=64time=1.95ms
^C
--- node2 ping statistics ---
2packets transmitted,2received,0% packet loss, time1003ms
rtt min/avg/max/mdev =1.951/5.826/9.701/3.875ms
#node1 node2配置同上一致便可
二、安裝docker環境
具體安裝過程參考前面的文章
配置docker
[root@manager ~]# vim /etc/sysconfig/docker
# /etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
OPTIONS='-H 0.0.0.0:2375 -H unix:///var/run/docker.sock --selinux-enabled --log-driver=journald --signature-verification=false'
#全部節點加上上面標記的部分,開啓2375端口
[root@manager ~]# systemctl restart docker
[root@manager ~]# ps -ef|grep docker
root119811110:55?00:00:00/usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json -H 0.0.0.0:2375 -H unix:///var/run/docker.sock --selinux-enabled --log-driver=journald --signature-verification=false--storage-driver overlay2
root1198611981010:55?00:00:00/usr/bin/docker-containerd-current -lunix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0--start-timeout2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --runtime-args --systemd-cgroup=true
root1207611823010:55pts/000:00:00grep --color=auto docker
[root@manager ~]# lsof -i :2375
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dockerd-c11981root5u IPv6418290t0TCP *:2375(LISTEN)
三、全部節點下載swarm鏡像文件
[root@manager ~]# docker pull swarm
Using default tag: latest
Trying to pull repository docker.io/library/swarm ...
latest: Pulling from docker.io/library/swarm
d85c18077b82: Pull complete
1e6bb16f8cb1: Pull complete
85bac13497d7: Pull complete
Digest: sha256:406022f04a3d0c5ce4dbdb60422f24052c20ab7e6d41ebe5723aa649c3833975
Status: Downloaded newer image for docker.io/swarm:latest
[root@manager ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/swarm latest ff454b4a0e84 12 days ago 12.7 MB
四、建立swarm並初始化
[root@manager ~]# docker swarm init --advertise-addr 192.168.22.177
Swarm initialized: current node (elyfa6h1lx5o2s98une5vas4x)isnow a manager.
To add a worker tothisswarm, run the following command:
docker swarm join \
--token SWMTKN-1-32h92m334z80z270d4duqdc3ysl1oyrjmxe1upyyfjyln12xxa-4gm603mczorxgh6751n5q7jya \
192.168.22.177:2377
To add a manager tothisswarm, run'docker swarm join-token manager'andfollow the instructions.
#執行上面的命令後,當前的服務器就加入到swarm集羣中,同時會產生一個惟一的token值,其它節點加入集羣時須要用到這個token。
#--advertise-addr 表示swarm集羣中其它節點使用後面的IP地址與管理節點通信,上面也提示了其它節點如何加入集羣的命令。
五、查看下當前的信息
[root@manager ~]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
Server Version: 1.13.1
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: journald
Cgroup Driver: systemd
Plugins:
Volume: local
Network: bridge host macvlan null overlay
**Swarm: active
NodeID: elyfa6h1lx5o2s98une5vas4x
Is Manager: true
ClusterID: vi716cgvw33gzicrfqopasf9p
Managers: 1
Nodes: 1
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Node Address: 192.168.22.177
Manager Addresses:
192.168.22.177:2377
Runtimes: docker-runc runc
Default Runtime: docker-runc
Init Binary: /usr/libexec/docker/docker-init-current
containerd version: (expected: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc version: e9c345b3f906d5dc5e8100b05ce37073a811c74a (expected: 9df8b306d01f59d3a8029be411de015b7304dd8f)
init version: 5b117de7f824f3d3825737cf09581645abbe35d4 (expected: 949e6facb77383876aeff8a6944dde66b3089574)
Security Options:
seccomp
WARNING: You're not using the default seccomp profile
Profile: /etc/docker/seccomp.json
Kernel Version: 3.10.0-693.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 3
CPUs: 1
Total Memory: 2.238 GiB
Name: manager
ID: 653Y:7CME:GFPW:35SX:IGZL:UJP7:YSPZ:4OMV:J4EV:Z6FS:WFW2:YYHS
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: bridge-nf-call-ip6tables is disabled
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Registries: docker.io (secure)
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
elyfa6h1lx5o2s98une5vas4x * manager Ready Active Leader
#當前節點的信息,這個*表示當前鏈接在這個節點上
六、將node1,node2加入到集羣中
[root@node1 ~]# docker swarm join --token SWMTKN-1-32h92m334z80z270d4duqdc3ysl1oyrjmxe1upyyfjyln12xxa-4gm603mczorxgh6751n5q7jya 192.168.22.177:2377
This node joined a swarmasa worker.
[root@node2 ~]# docker swarm join --token SWMTKN-1-32h92m334z80z270d4duqdc3ysl1oyrjmxe1upyyfjyln12xxa-4gm603mczorxgh6751n5q7jya 192.168.22.177:2377
This node joined a swarmasa worker.
#若是加入集羣時報錯以下
[root@node1 ~]# docker swarm join --token SWMTKN-1-32h92m334z80z270d4duqdc3ysl1oyrjmxe1upyyfjyln12xxa-4gm603mczorxgh6751n5q7jya 192.168.22.177:2377
Error responsefromdaemon: rpc error: code =13desc = connection error: desc ="transport: x509: certificate has expired or is not yet valid"
#注意服務器時間同步問題,解決便可。
七、管理節點查看集羣節點狀態
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
elyfa6h1lx5o2s98une5vas4x * manager Ready Active Leader
tcuv2p8wd6rvmwg39pdav5ozk node1 Ready Active
twytwc5dlp77vu1b7cakks9w2 node2 Ready Active
#swarm集羣中node的AVAILABILITY狀態有兩種:Active、drain。其中actice狀態的節點能夠接受管理節點的任務指派;drain狀態的節點會結束任務,也不會接受管理節點的任務指派,節點處於下線狀態。
[root@manager ~]# docker node update --availability drain node2
node2
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
elyfa6h1lx5o2s98une5vas4x * manager Ready Active Leader
tcuv2p8wd6rvmwg39pdav5ozk node1 Ready Active
twytwc5dlp77vu1b7cakks9w2 node2 Ready Drain
[root@manager ~]# docker node update --availability active node2
node2
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
elyfa6h1lx5o2s98une5vas4x * manager Ready Active Leader
tcuv2p8wd6rvmwg39pdav5ozk node1 Ready Active
twytwc5dlp77vu1b7cakks9w2 node2 Ready Active
#在manager節點上查看狀態信息
[root@manager ~]# docker node inspect self
[
{
"ID":"elyfa6h1lx5o2s98une5vas4x",
"Version": {
"Index": 9
},
"CreatedAt":"2018-06-14T15:01:19.850821157Z",
"UpdatedAt":"2018-06-14T15:01:20.472379584Z",
"Spec": {
"Role":"manager",
"Availability":"active"
},
"Description": {
"Hostname":"manager",
"Platform": {
"Architecture":"x86_64",
"OS":"linux"
},
"Resources": {
"NanoCPUs": 1000000000,
"MemoryBytes": 2402566144
},
"Engine": {
"EngineVersion":"1.13.1",
"Plugins": [
{
"Type":"Network",
"Name":"bridge"
},
{
"Type":"Network",
"Name":"host"
},
{
"Type":"Network",
"Name":"macvlan"
},
{
"Type":"Network",
"Name":"null"
},
{
"Type":"Network",
"Name":"overlay"
},
{
"Type":"Volume",
"Name":"local"
}
]
}
},
"Status": {
"State":"ready",
"Addr":"127.0.0.1"
},
"ManagerStatus": {
"Leader":true,
"Reachability":"reachable",
"Addr":"192.168.22.177:2377"
}
}
]
Swarm 的Web管理
[root@manager ~]# docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
Unable to find image'portainer/portainer:latest'locally
Trying to pull repository docker.io/portainer/portainer ...
latest: Pullingfromdocker.io/portainer/portainer
d1e017099d17: Pull complete
0d90a7ef0797: Pull complete
Digest: sha256:2933caa6e578e94b5d91429ea7f47ae9741ee11b71d7cb740e76c5f234cc1d87
Status: Downloaded newer imagefordocker.io/portainer/portainer:latest
798b3bea009792321519f5b7144e357ce9c5cea3b9341b5276a4d29f7571684a
[root@manager ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
798b3bea0097 portainer/portainer"/portainer"6seconds ago Up5seconds0.0.0.0:9000->9000/tcp amazing_snyder
瀏覽器訪問
docker-swarm佈署服務
一、佈署服務前建立於個用於集羣內不一樣主機之間容器通訊的網絡
[root@manager ~]# docker network create -d overlay dockernet
pmn1fi6lj421hn1nk7652m41h
[root@manager ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
d913c7a275fe bridge bridgelocal
c737cf269524 docker_gwbridge bridgelocal
pmn1fi6lj421 dockernet overlay swarm
eac1d68d35d7 host hostlocal
wxshzhdvq52y ingress overlay swarm
c5986aec6119 none nulllocal
二、建立服務(nginx爲例)
[root@manager ~]# docker service create --replicas 1 --network dockernet --name nginx-cluster -p 80:80 nginx
k7lupo9xu0cnd5ng1g4f7i7jx
#--replicas 指定副本數量
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE
k7lupo9xu0cn nginx-cluster replicated1/1nginx:latest
[root@manager ~]# docker service ps nginx-cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
7t7xjpmao533 nginx-cluster.1nginx:latest manager Running Running17seconds ago
[root@manager ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9d78079fdc7 nginx@sha256:3e2ffcf0edca2a4e9b24ca442d227baea7b7f0e33ad654ef1eb806fbd9bedcf0"nginx -g 'daemon ..."22seconds ago Up22seconds80/tcp nginx-cluster.1.7t7xjpmao5335zaa8wp0c896a
三、在線動態擴容服務
[root@manager ~]# docker service scale nginx-cluster=5
nginx-cluster scaled to5
[root@manager ~]# docker service ps nginx-cluster
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
7t7xjpmao533 nginx-cluster.1nginx:latest manager Running Running2hours ago
vitsgxpdf3bn nginx-cluster.2nginx:latest manager Running Running2seconds ago
o9w529mmttsw nginx-cluster.3nginx:latest node1 Running Preparing2seconds ago
cfz8dkx9p6ih nginx-cluster.4nginx:latest node2 Running Preparing2seconds ago
9p35iunijoro nginx-cluster.5nginx:latest node2 Running Preparing2seconds ago
#從輸出結果能夠看出已經將服務動態擴容至5個,也就是5個容器運行着相同的服務
[root@node2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3a4fb24480a nginx@sha256:3e2ffcf0edca2a4e9b24ca442d227baea7b7f0e33ad654ef1eb806fbd9bedcf0"nginx -g 'daemon ..."3minutes ago Up3minutes80/tcp nginx-cluster.5.9p35iunijorol1d2ikhyj11oi
f8b0b2e514eb nginx@sha256:3e2ffcf0edca2a4e9b24ca442d227baea7b7f0e33ad654ef1eb806fbd9bedcf0"nginx -g 'daemon ..."3minutes ago Up3minutes80/tcp nginx-cluster.4.cfz8dkx9p6ih40lwwwvd96xdg
#登陸node2查看正在運行的容器,發現與管理節點上顯示的結果相同,node2上運行兩個容器
四、節點故障
[root@manager ~]#dockerservicepsnginx-cluster
IDNAMEIMAGENODEDESIREDSTATECURRENTSTATEERRORPORTS
7t7xjpmao533nginx-cluster.1nginx:latestmanagerRunningRunning2hoursago
vitsgxpdf3bnnginx-cluster.2nginx:latestmanagerRunningRunning10minutesago
f13cun1wyxltnginx-cluster.3nginx:latestmanagerRunningRunning9minutesago
q60fo5mja1ab\_nginx-cluster.3nginx:latestnode1ShutdownFailed9minutesago"startingcontainerfailed:sh…"
mao4htxp7afr\_nginx-cluster.3nginx:latestnode1ShutdownFailed9minutesago"startingcontainerfailed:sh…"
fhiecco742y4\_nginx-cluster.3nginx:latestnode1ShutdownFailed10minutesago"startingcontainerfailed:sh…"
8qp5kryo62ha\_nginx-cluster.3nginx:latestnode1ShutdownFailed10minutesago"startingcontainerfailed:sh…"
cfz8dkx9p6ihnginx-cluster.4nginx:latestnode2RunningRunning9minutesago
9p35iunijoronginx-cluster.5nginx:latestnode2RunningRunning9minutesago
#若是集羣中節點發生故障,會從swarm集羣中被T除,而後利用自身的負載均衡及調度功能,將服務調度到其它節點上
五、其它經常使用命令介紹
除了上面使用scale來實如今線動態擴容、縮容以外,還可使用update來對服務進行調整
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE
k7lupo9xu0cn nginx-cluster replicated 5/5 nginx:latest
[root@manager ~]# docker service update --replicas 2 nginx-cluster
nginx-cluster
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE
k7lupo9xu0cn nginx-cluster replicated 2/2 nginx:latest
#將服務縮減到2個
[root@manager ~]# docker service update --image nginx:new nginx-cluster
#更新服務的鏡像版本
[root@manager ~]# docker service --help
Usage: docker service COMMAND
Manage services
Options:
--help Print usage
Commands:
createCreateanewservice
inspect Display detailed informationononeormore services
lsListservices
psListthe tasksofa service
rm Remove oneormore services
scale Scale oneormultiple replicated services
updateUpdatea service
Run'docker service COMMAND --help'formore informationona command.
[root@manager ~]# docker rm nginx-cluster
#將全部節點上的全部容器所有刪除,任務也將所有刪除
歡迎工做一到五年的Java工程師朋友們加入Java架構開發:744677563
羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!