**
Swarm架構
**
Swarm作爲一個管理Docker集羣的工具,首先需要將其部署起來,可以單獨將Swarm部署於一個節點。另外,自然需要一個Docker集羣,集羣上每一個節點均安裝有Docker。
Swarm架構中最主要的處理部分自然是Swarm節點,Swarm管理的對象自然是Docker Cluster,Docker Cluster由多個Docker Node組成,而負責給Swarm發送請求的是Docker Client。
Swarm deamon只是一個調度器(Scheduler)加路由器(router),Swarm自己不運行容器,它只是接受docker客戶端發送過來的請求,調度適合的節點來運行容器,這意味着,即使Swarm由於某些原因掛掉了,集羣中的節點也會照常運行,當Swarm重新恢復運行之後,它會收集重建集羣信息。
**
環境搭建
**
三臺主機
server0 172.25.254.56
server1 172.25.254.50
server2 172.25.254.1
安裝docker
vim /etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/experimental/centos/7/
enabled=1
gpgcheck=0
gpgkey=https://yum.dockerproject.org/gpg
~
yum -y install docker-engine
[root@foundation156 ~]# systemctl start docker
[root@foundation156 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@foundation156 ~]# docker --version
Docker version 1.12.6, build 78d1802, experimental
三臺主機安裝即可
ps (根據前一部分的博客選擇rpm包安裝也可以)
swarm集羣搭建
node0作爲初始節點供其他節點加入
Connection to server1 closed.
[root@foundation156 Desktop]# docker swarm init --advertise-addr 172.25.254.56
Swarm initialized: current node (59rkk6ozh5h1ddptl88f52h0v) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-589zuow0efnzllasdj1nei7w34p02z6mkm443o3i5avuvn01tj-3ywyld3erpdnf7n4jhbgbzocs \
172.25.254.56:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
執行命令後提示其他節點使用系統提示命令加入節點即可
節點加入
[root@server2 docker]# docker swarm join --token SWMTKN-1-589zuow0efnzllasdj1nei7w34p02z6mkm443o3i5avuvn01tj-3ywyld3erpdnf7n4jhbgbzocs 172.25.254.56:2377
This node joined a swarm as a worker.
在node查看端口使用情況
看到使用了2377端口 所以在需要打開防火牆時 需要打開對應的端口
[root@foundation156 Desktop]# netstat -anple |grep docker
tcp 0 0 172.25.254.56:56024 172.25.254.56:2377 ESTABLISHED 0 73800 3548/dockerd
tcp 0 0 127.0.0.1:43323 127.0.0.1:2377 ESTABLISHED 0 72244 3548/dockerd
tcp6 0 0 :::2377 :::* LISTEN 0 70307 3548/dockerd
tcp6 0 0 :::7946 :::* LISTEN 0 70312 3548/dockerd
tcp6 0 0 127.0.0.1:2377 127.0.0.1:43323 ESTABLISHED 0 70309 3548/dockerd
tcp6 0 0 172.25.254.56:2377 172.25.254.56:56024 ESTABLISHED 0 72273 3548/dockerd
tcp6 0 0 172.25.254.56:2377 172.25.254.50:45988 ESTABLISHED 0 73673 3548/dockerd
tcp6 0 0 172.25.254.56:2377 172.25.254.1:51654 ESTABLISHED 0 73669 3548/dockerd
udp6 0 0 :::7946 :::* 0 70313 3548/dockerd
在node0查看是否成爲sarm集羣
docker info
........
Swarm: active
NodeID: 59rkk6ozh5h1ddptl88f52h0v
Is Manager: true
ClusterID: 8bq7ol10vkzyra3xhlfvuv0t3
Managers: 1
Nodes: 3
Orchestration:
Task History Retention Limit: 5
........
列出所有節點
[root@foundation156 Desktop]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
59rkk6ozh5h1ddptl88f52h0v * foundation156.ilt.example.com Ready Active Leader
6246ae4zn9asricvh2d3uc1qp server1 Ready Active
daugy9sjlh5zet6vnkh0fo1h3 server2 Ready Active
在忘記添加節點命令時 通過以下命令查看
[root@foundation156 Desktop]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-589zuow0efnzllasdj1nei7w34p02z6mkm443o3i5avuvn01tj-5taetju3kdmcvcunu3h7csm3l \
172.25.254.56:2377
[root@foundation156 Desktop]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-589zuow0efnzllasdj1nei7w34p02z6mkm443o3i5avuvn01tj-3ywyld3erpdnf7n4jhbgbzocs \
172.25.254.56:2377
目前只有一個主導的節點server0 爲了集羣高可用並且避免單點故障
提升server1爲manager節點 使其也可以管理集羣
[root@foundation156 Desktop]# docker node promote server1
Node server1 promoted to a manager in the swarm.
[root@foundation156 Desktop]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
59rkk6ozh5h1ddptl88f52h0v * foundation156.ilt.example.com Ready Active Leader
6246ae4zn9asricvh2d3uc1qp server1 Ready Active Reachable
daugy9sjlh5zet6vnkh0fo1h3 server2 Ready Active
常用命令
docker swarm:集羣管理,子命令主要有下面幾個。
docker swarm init命令用於初始化一個集羣
docker swarm join命令用於加入一個現有集羣
docker swarm leave命令由於離開集羣
有些時候需要維護一個節點,此時此節點可能會網絡斷開或者需要關機,造成節點上服務不可用。使用 docker node update –availability drain 將節點下線,swarm 會將當前節點上的容器關閉並在其他節點上啓動。當維護完成,需要上線是,將節點狀態修改爲 active狀態即可,命令如下:docker node update –availability active
運行服務測試集羣性能
在物理機pull nginx鏡像 本紀可以使用 但是虛擬機上網下載太滿 所以將物理機鏡像保存爲tar文件scp讓虛擬機使用即可
[root@foundation156 Desktop]# docker save -o nginx.tar nginx
[root@foundation156 Desktop]# ll nginx.tar
-rw------- 1 root root 112703488 Aug 20 20:18 nginx.tar
[root@foundation156 Desktop]# scp nginx.tar root@server1:/mnt/
nginx.tar 100% 107MB 107.5MB/s 00:01
[root@foundation156 Desktop]# scp nginx.tar root@server2:/mnt/
nginx.tar 100% 107MB 107.5MB/s 00:01
[root@foundation156 Desktop]# docker service rm nginx
nginx
虛擬機導入鏡像即可
[root@server2 docker]# vim /etc/sysconfig/network-scripts/ifcfg-ens3
[root@server2 docker]# cd /mnt/
[root@server2 mnt]# docker load -i nginx.tar
cdb3f9544e4c: Loading layer 58.44 MB/58.44 MB
a8c4aeeaa045: Loading layer 54.24 MB/54.24 MB
08d25fa0442e: Loading layer 3.584 kB/3.584 kB
Loaded image: nginx:latest
[root@server2 mnt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c82521676580 3 weeks ago 109 MB
[root@foundation156 Desktop]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
be8881be8156: Pull complete
32d9726baeef: Pull complete
87e5e6f71297: Pull complete
Digest: sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
Status: Downloaded newer image for nginx:latest
[root@foundation156 Desktop]# docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c82521676580 3 weeks ago 109 MB
[root@foundation156 Desktop]# docker service create --replicas 3 -p 80:80 --name nginx nginx:latest
244icxsoy3n8g5gh4otdio0pp
[root@foundation156 Desktop]# docker service ls
ID NAME REPLICAS IMAGE COMMAND
244icxsoy3n8 nginx 1/3 nginx:latest
查看物理機nginx服務詳細信息
[root@foundation156 Desktop]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
cqawk4av2vj2579lsc7n8udse nginx.1 nginx:latest server0 Running Running 3 seconds ago
1rvhljwyvajyklqkbjgn7fbt8 nginx.2 nginx:latest server2 Running Preparing 8 seconds ago
bhkx7if20gcwd8wrgkq7aqcqr nginx.3 nginx:latest server1 Running Running 6 seconds ago
查看節點的進程
[root@server1 mnt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7aade034cd8b nginx:latest "nginx -g 'daemon ..." 2 minutes ago Up 2 minutes 80/tcp nginx.2.bn25l3rukkufe34ry7kkzu06h
瀏覽器測試即可
使用 visualzer進行測試
安裝鏡像
[root@server1 ~]# docker run -it -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer
e6bc05f62386ea0c5730dbb6c5393224e81f61e831a2931c14cbff04d1c79011
瀏覽器測試即可
關閉server後
服務漂移至server3
[root@server3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e599b133fd8 nginx:latest "nginx -g 'daemon ..." 5 minutes ago Up 4 minutes 80/tcp nginx.1.8yy6rf4g565xqeb6q50y8hroa
e7ef3ec12304 nginx:latest "nginx -g 'daemon ..." 33 minutes ago Up 33 minutes 80/tcp nginx.2.qq3si9jorvrml2dq5ftkvshny
再測試負載均衡
成功
[root@foundation15 docker]# for i in {1..10};do curl 172.25.15.20; done
server1
server3
server2
server1
server3
server2
server1
server3
server2
server1
批量化生成nginx
[root@server1 ~]# docker service scale nginx=30
批量更新 這一步再生產中作用較大
測試再nginx主機上更新2048鏡像
[root@server1 ~]# docker service update --image westos.org/game2048 --update-parallelism 3 --update-delay 10s nginx
nginx
等待更新即可
看到30臺已經更新完成
[root@server1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE
1mj2yiaoo9ok viz replicated 1/1 dockersamples/visualizer:latest
p16i2s6m74zg nginx replicated 30/30 westos.org/game2048:latest