一.初识Swarm
Swarm 是 Docker 公司在 2014 年 12 月初发布的一套较为简单的工具,用来管理 Docker 集群,它将一群 Docker 宿主机变成
一个单一的,虚拟的主机。Swarm 使用标准的 Docker API接口作为其前端访问入口。换言之,各种形式的 Docker Client
(docker client in go,docker_py,docker 等)均可以直接与 Swarm 通信。Swarm 几乎全部用 Go 语言来完成开发。Swarm
deamon 只是一个调度器(Scheduler)加路由器(router),Swarm 自己不运行容器,它只是接受 docker 客户端发送过来的请求,
调度适合的节点来运行容器,这意味着,即使Swarm 由于某些原因挂掉了,集群中的节点也会照常运行,当 Swarm 重新恢复
运行之后,它会收集重建集群信息。
二.实验环境(rhel7.3版本)
1.selinux和firewalld状态为disabled
2.各主机信息如下:
主机 | ip |
---|---|
server1(manager) | 172.25.83.1 |
server2(node) | 172.25.83.2 |
server3(node) | 172.25.83.3 |
foundation83(用来测试) | 172.25.83.83 |
3.删除之前的docker-compose,以免占用80端口,影响后续的实验
[root@server1 compose]# docker-compose stop #停掉docker-compose
[root@server1 compose]# docker-compose rm #删除docker-compose
三.Docker Swarm集群的搭建部署
Docker Swarm集群的搭建
1、三个节点安装Docker并开启服务
[root@server1 ~]# ls
container-selinux-2.21-1.el7.noarch.rpm
docker-ce-18.06.1.ce-3.el7.x86_64.rpm
libsemanage-2.5-8.el7.x86_64.rpm
libsemanage-python-2.5-8.el7.x86_64.rpm
pigz-2.3.4-1.el7.x86_64.rpm
policycoreutils-2.5-17.1.el7.x86_64.rpm
policycoreutils-python-2.5-17.1.el7.x86_64.rpm
[root@server1 ~]# yum install -y * #安装docker服务
[root@server1 ~]# systemctl start docker #启动docker服务
##server2,server3类似
2、在serever1(manager节点)上初始化集群(swarm)
[root@server1 ~]# docker swarm init
- 在server1节点上查看桥接信息
- 在server1节点上查看docker的网络信息
3、server2,server3(worker节点)加入集群
[root@server2 ~]# docker swarm join \
> --token SWMTKN-1-36j2ld6xqyfjspr2c05i3qnutapuk4x89nha6w0nfbr1mg3krb3dc4aphv0jxu0wuivo2eviirk \
> 172.25.83.1:2377
[root@server3 ~]# docker swarm join \
> --token SWMTKN-1-36j2ld6xqyfjspr2c05i3qnutapuk4x89nha6w0nfbr1mg3krb3dc4aphv0jxu0wuivo2eviirk \
> 172.25.83.1:2377
- 在server1(manager节点)查看节点信息
- 在server2节点上查看桥接信息(server3上类似)
- 在server2节点上查看docker的网络信息(server3类似)
部署服务:
1、三个节点都要导入nginx镜像
##首先在网上下载nginx.tar
[root@server1 ~]# docker load -i nginx.tar
[root@server2 ~]# docker load -i nginx.tar
[root@server3 ~]# docker load -i nginx.tar
2、在manager节点上部署了一个Nginx容器
[root@server1 ~]# docker network create -d overlay my_net1 #创建驱动为overlay的网络
[root@server1 ~]# docker service create --name web \
> --network my_net1 \
> --replicas 3 \ #–replicas 3就是代表集群的个数变为3。manager会将容器平均分配到三个节点上
> -p 8080:80 \ #或-publish 8080:80或-publish=8080:80/tcp
> nginx #创建一个名称为web,副本为3,开放端口为80的nginx容器
#这里使用的是自己创建的驱动为overlay的网络(值的一提的是:如果这里指定网络,则必须是驱动为overlay的网络)。当然也可以不加--network my_net1,使用默认的网络。只是使用自己的网络,可能出现的问题会比较少。
- 查看8080端口
- 查看docker服务列表
- 查看docker的web服务
- 查看三台主机节点的nginx服务的默认发布页
2、三个节点都要操作:从容器中复制文件到主机nginx默认发布目录
[root@server1 ~]# vim index.html
server1
[root@server1 ~]# docker cp index.html 62455b51943c:/usr/share/nginx/html
server2,server3同上
[root@server2 ~]# vim index.html
server2
[root@server2 ~]# docker cp index.html be458c39a36d:/usr/share/nginx/html
[root@server3 ~]# vim index.html
server3
[root@server3 ~]# docker cp index.html 21f473c4785f:/usr/share/nginx/html
3、在物理机上测试(负载均衡)
有人在测试的过程中,可能会出现这样的问题:一会儿有结果,一会儿没有结果,这是为什么呢?原因是什么呢?
答:
检查宿主机server1,server2和测试主机的防火墙有没有关。如果没有关,那么关掉防火墙,然后再进行测试。
四.容器在线扩张以及压缩(增加或减少服务数目)
注意:增加或减少服务数目,直接对scale的数据设置即可
1.增加scale的数目(需要部署新添加进来的容器)
[root@server1 ~]# docker service scale web=6
- 增加scale数目
三个节点都要操作:从容器中复制文件到主机nginx默认发布目录
配置server1:
[root@server1 ~]# vim index.html
server4
[root@server1 ~]# docker cp index.html f5310d565a56:/usr/share/nginx/html
配置server2:
[root@server2 ~]# vim index.html
server5
[root@server2 ~]# docker cp index.html 437d062ab278:/usr/share/nginx/html
配置server3:
[root@server3 ~]# vim index.html
server6
[root@server3 ~]# docker cp index.html a57e027608c9:/usr/share/nginx/html
在物理机上进行测试(负载均衡):
2.减少scale的数目(不需要部署新添加进来的容器)
[root@server1 ~]# docker service scale web=3
- 减少scale数目