**
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