Docker之swarm集群的搭建
docker三剑客:swarm mesos k8s一、知识剖析Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in go, docker_py, ...
·
- docker三剑客:swarm mesos k8s
一、知识剖析
- Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in go, docker_py, docker等)均可以直接与Swarm通信。
- Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息
- 下面是Swarm的结构图
- swarm集群
使用的是docker自带的swarm mode,也就是docker集群的管理和编排。所谓的编排就是指多台集群的管理, 主机的配置,容器的调度等。
swarm mode是docker engine中自带的一种模式,很容易使用,并且无须安装其他的软件。 在使用swarm mode的时候,几台主机上都要先安装好docker。
二、swarm集群的搭建
实验环境:(安装docker并开启)
- docker1:172.25.79.1 swarm
- docker2: 172.25.79.2 node
- 在docker1上做初始化
[root@docker1 ~]# docker swarm init
Swarm initialized: current node (onmfjan5xiq2ek6vf6oalpvqp) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.19.1:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
##注意:在当前主机上启动swarm模式,要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥
- docker1和docker2加入swarm集群中
[root@docker2 ~]# docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.19.1:2377
[root@docker3 ~]# docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.19.1:2377
- 查看节点状态
[root@server1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
o4abf7l821zrls2aa1m4cj7pu server3 Ready Active
u5mihispcziw1svmyjh9jx9g2 * server1 Ready Active Leader
zrkp0dz7mzef7f6f5j08ec0c1 server2 Ready Active
- 都导入nginx镜像
[root@docker1 ~]# docker load -i nginx.tar
[root@docker2 ~]# docker load -i nginx.tar
[root@docker3 ~]# docker load -i nginx.tar
- 部署一个服务群集
[root@docker1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9899107ae90e bridge bridge local
076f11525d73 docker_gwbridge bridge local
3281f4c216de host host local
i47byuadtg61 ingress overlay swarm
6b89c5ac48c1 none null local
[root@docker1 ~]# docker network create -d overlay my_net1
a8gg980w0j9s5ilmsffms9sbw
##在manager节点部署nginx服务,服务数量为3个 ,使用nginx镜像
[root@docker1 ~]# docker service create --name web --network my_net1 publish 80:80 --replicas 30 nginx
[root@docker1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ey3kgh65bp2g web replicated 3/3 nginx:latest *:80->80/tcp
- 编写测试页面
[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b6c0052888f nginx:latest "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp web.2.6x5cwmlgodu8v5yx5961nry80
[root@docker1 ~]# vim index.html
server1
[root@docker1 ~]# docker cp index.html 8b6c0052888f:/usr/share/nginx/html
##docker2,docker3同理
- 测试负载均衡( 测试的时候把真机火墙关掉 )
[root@server1 ~]# for i in {1..10}; do curl 172.25.79.1; done
server3
server3
server2
server1
server2
server1
server3
server3
server2
server1
[root@server1 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j939nrzgr8do nginx.1 nginx server3 Running Running 9 seconds ago
st431kqieqod nginx.2 nginx server1 Running Running 10 seconds ago
tr263kopgsbo nginx.3 nginx server2 Running Running 9 seconds ago
- 添加 6 个nginx 服务
[root@server1 ~]# docker service scale nginx=6
unable to pin image nginx to digest: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 114.114.114.114:53: read udp 172.25.79.1:37142->114.114.114.114:53: i/o timeout
nginx scaled to 6
##查看有6个nginx 进程是 Running :
[root@server1 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j939nrzgr8do nginx.1 nginx server3 Running Running 3 minutes ago
st431kqieqod nginx.2 nginx server1 Running Running 3 minutes ago
tr263kopgsbo nginx.3 nginx server2 Running Running 3 minutes ago
zryz1niphg19 nginx.4 nginx server1 Running Preparing 6 seconds ago
6mwqzfqg8f8o nginx.5 nginx server2 Running Preparing 5 seconds ago
x3ci0tq8ldh4 nginx.6 nginx server3 Running Preparing 5 seconds ago
- 添加监控
- 导入镜像并创建监控
[root@docker1 ~]# docker load -i visualizer.tar
[root@docker1 ~]# docker load -i nginx.tar
[root@docker1 ~]# docker service create \
--name=viz \
--publish=8080:8080/tcp \
--constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
dockersamples/visualizer
- 查看监控和节点是否在线
[root@server1 docker]# docker service ls
ID NAME MODE REPLICAS IMAGE
4cqg0b6nwe44 nginx replicated 6/6 nginx
vydqo176ak6p viz replicated 1/1 dockersamples/visualizer
##注意:开启viz服务慢,需要不断刷新等待建立完成,出现1/1才成功
- 浏览器:输入172.25.19.1:8080,可以看到6个nginx的进程被平均分在了三台机子上
- 滚动更新
- 重新添加一个镜像
[root@docker1 ~]# docker load -i rhel7.tar
[root@docker1 ~]# docker service update --image rhel7:v1 --update-delay 5s --update-parallelism 1 web ##每隔五秒更新,每次更新一个机子
##docker ps -aq | wc -l ##可看到每个机子上开启了多少个(一般都是平均)
- 浏览器的监控镜像由nginx变成了rhel7
- 测试高可用
- 此时是在只有3个进程的基础上测试的
- 停掉一个node:
[root@docker2 share]# systemctl stop docker
- 此时的负载均衡就在server1和server3主机上实现
[root@docker1 ~]# for i in {1..10}; do curl 172.25.79.1; done
docker3
docker1
docker3
docker1
docker3
docker1
docker3
docker1
docker3
docker1
- 浏览器的监控显示server2故障,并且6个nginx进程被平均分到docker1和docker上
更多推荐
已为社区贡献2条内容
所有评论(0)