Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker
Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
Swarm的基本架构如下图所示:
任何规模都有高性能表现 对于企业级的 Docker Engine 集群和容器调度而言,可拓展性是关键。任何规模的公司——不论是拥有五个还是上千个服务器——都能在其环境下有效使用 Swarm。 经过测试,Swarm 可拓展性的极限是在 1000 个节点上运行 50000 个部署容器,每个容器的启动时间为亚秒级,同时性能无减损。
灵活的容器调度
Swarm 帮助 IT 运维团队在有限条件下将性能表现和资源利用最优化。Swarm 的内置调度器(scheduler)支持多种过滤器,包括:节点标签,亲和性和多种容器部策略如 binpack、spread、random 等等。
服务的持续可用性
Docker Swarm 由 Swarm Manager 提供高可用性,通过创建多个 Swarm master 节点和制定主 master 节点宕机时的备选策略。如果一个 master 节点宕机,那么一个 slave 节点就会被升格为 master 节点,直到原来的 master 节点恢复正常。 此外,如果某个节点无法加入集群,Swarm 会继续尝试加入,并提供错误警报和日志。在节点出错时,Swarm 现在可以尝试把容器重新调度到正常的节点上去。
和 Docker API 及整合支持的兼容性
Swarm 对 Docker API 完全支持,这意味着它能为使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用户提供无缝衔接的使用体验。
Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持
开发的 Compose 文件能(通过 docker-compose up )轻易地部署到测试服务器或 Swarm 集群上。Docker Swarm 还可以从 Docker Trusted Registry 或 Hub 里 pull 并 run 镜像。
主机 | IP地址 | 服务 |
---|---|---|
docker01 | 192.168.1.11 | swarm+service+webUI+registry |
docker02 | 192.168.1.13 | docker |
docker03 | 192.168.1.20 | docker |
三台主机都关闭防火墙,禁用selinux,修改主机名,时间同步,并添加域名解析。
docker版本必须是:v1.12版本开始(可使用docker version查看版本)
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# hostnamectl set-hostname docker03
[root@localhost ~]# su -
mv /etc/localtime /etc/localtime.bk
cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime
[root@localhost ~]# hostnamectl set-hostname docker01
[root@localhost ~]# su -
[root@docker01 ~]# echo 192.168.1.11 docker01 >> /etc/hosts
[root@docker01 ~]# echo 192.168.1.13 docker02 >> /etc/hosts
[root@docker01 ~]# echo 192.168.1.20 docker03 >> /etc/hosts
[root@docker01 ~]# docker swarm init --advertise-addr 192.168.1.11
--advertise-addr:指定与其它docker通信的地址。
上边返回的结果告诉我们:初始化成功,并且,如果想要添加work节点运行下面的命令:
注意:token令牌只有24小时的有效期
如果想要添加manager节点:运行下面命令
[root@docker03 ~]# docker swarm join --token SWMTKN-1-5kxn9wloh7npnytklwbfciesr9di7uvu521gwnqm9h2n0pbokj-1e60wt0yr5583e4mzwbxnn3a8 192.168.1.11:2377
[root@docker01 ~]# docker node ls
*注意:这里的”****“代表的是当前所属的节点
[root@docker01 ~]# docker node update docker01 --availability drain
设置主机docker01以后不运行容器,但已经运行的容器并不会停止
“--availability”选项后面共有三个选项可配置,如下:
“active”:工作;“pause”:暂时不工作;“drain”:永久性的不工作
[root@docker01 ~]# docker node ls
[root@docker01~]# docker pull dockersamples/visualizer
[root@docker01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.100 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualiaer dockersamples/visualizer
如果访问不到网页,需开启路由转发
[root@docker01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@docker01 ~]# sysctl -p
72 docker pull registry
//下载registry镜像
73 docker run -itd --name registry -p 5000:5000 --restart=always registry:latest
//基于registry镜像,启动一台容器
78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000
80 systemctl daemon-reload
81 systemctl restart docker.service
//重启docker
76 docker tag busybox:latest 192.168.1.11:5000/busybox:v1
//把容器重命名一个标签
77 docker ps
78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000
80 systemctl daemon-reload
81 systemctl restart docker.service
//重启docker
100 docker push 192.168.1.11:5000/busybox:v1
//上传容器到私有仓库
78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000
80 systemctl daemon-reload
81 systemctl restart docker.service
//重启docker
99 docker pull 192.168.1.11/busybox:v1
//测试下载
[root@docker01 ~]# docker pull httpd
//下载httpd镜像
创建三个测试目录
[root@docker01 ~]# mkdir {v1,v2,v3}
//创建测试目录
docker01,v1目录操作
[root@docker01 ~]# cd v1
[root@docker01 v1]# echo v1,xgp666 > index.html
//创建测试网页
[root@docker01 v1]# vim Dockerfile
//编写Dockerfile
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html
[root@docker01 v1]# docker build -t 192.168.1.11:5000/httpd:v1 .
//基于dockerfile创建镜像
[root@docker01 v1]# docker push 192.168.1.11:5000/httpd:v1
//上传刚刚创建镜像到私有仓库
docker01,v2目录操作
[root@docker01 v1]# cd ../v2
[root@docker01 v2]# echo v2,xgp666 > index.html
[root@docker01 v2]# vim Dockerfile
//编写Dockerfile
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html
[root@docker01 v2]# docker build -t 192.168.1.11:5000/httpd:v2 .
//基于dockerfile创建镜像
[root@docker01 v2]# docker push 192.168.1.11:5000/httpd:v2
//上传刚刚创建镜像到私有仓库
docker01,v3目录操作
[root@docker01 v1]# cd ../v3
[root@docker01 v2]# echo v3,xgp666 > index.html
[root@docker01 v2]# vim Dockerfile
//编写Dockerfile
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html
[root@docker01 v2]# docker build -t 192.168.1.11:5000/httpd:v3 .
//基于dockerfile创建镜像
[root@docker01 v2]# docker push 192.168.1.11:5000/httpd:v3
//上传刚刚创建镜像到私有仓库
[root@docker01 v3]# docker service create --replicas 3 --name bdqn -p 80:80 192.168.1.11:5000/httpd:v1
查看一下网络
[root@docker03 ~]# docker network ls
默认的Ingress网络,包括创建的自定义overlay网络, 为后端真正为用户提供服务的container,提供了一个统一的入口。
service 通过 ingress load balancing 来发布服务,且 swarm 集群中所有 node 都参与到 ingress 路由网格(ingress routing mesh) 中,访问任意一个 node+PublishedPort 即可访问到服务。
当访问任何节点上的端口80时,Docker将您的请求路由到活动容器。在群节点本身,端口80可能并不实际绑定,但路由网格知道如何路由流量,并防止任何端口冲突的发生。
路由网格在发布的端口上监听分配给节点的任何IP地址。对于外部可路由的IP地址,该端口可从主机外部获得。对于所有其他IP地址,只能从主机内部访问。
[root@docker01 v3]# docker service ps bdqn
[root@docker02 ~]# docker exec -it 388f3bd9dd33 /bin/bash
root@388f3bd9dd33:/usr/local/apache2# cd htdocs/
root@388f3bd9dd33:/usr/local/apache2/htdocs# echo 123 > index.html
[root@docker03 ~]# docker exec -it 281454867fac /bin/bash
root@281454867fac:/usr/local/apache2# echo 321 > htdocs/index.html
[root@docker01 v3]# docker service create --replicas 3 --name test -p 80 192.168.1.11:5000/httpd:v1
[root@docker01 v3]# docker service ls
默认映射端口30000-32767
[root@docker01 v3]# docker service scale bdqn=6
[root@docker01 v3]# docker service scale bdqn=4
扩容与缩容直接直接通过scale进行设置副本数量。
docker service upadte 命令参数详解
--force 强制更新重启服务,无论是否配置或镜像改变都更新
--image <image:tag> 制定更新的镜像
--with-registry-auth 向 Swarm 代理发送 Registry 认证详细信息,私有仓库需要携带该参数
[root@docker01 ~]# docker service update --image 192.168.1.11:5000/httpd:v2 bdqn
//把bdqn服务升级成v2的版本
[root@docker01 ~]# docker service update --image 192.168.1.11:5000/httpd:v3 --update-parallelism 2 --update-delay 1m bdqn
//两个服务一起更新,然后,隔一分钟,继续更新
默认情况下, swarm-次只更新-个副本,并且两个副本之间没有等待时间,我们可以通过
--update-parallelism;设置并行更新的副本数量。
--update-delay:指定滚动更新的时间间隔。
[root@docker01 ~]# docker service rollback bdqn
注意,docker swarm的回滚操作,默认只能回滚到上一-次操作的状态,并不能连续回滚到指定操作。
如果一台机器启用多个服务注意,合理分配cpu与内存资源,因tomcat在启动编译时会很吃内存,且docker是多线程启动的,所有最好是限定一下(设置resources.limits)否者会导致内存在同一时刻用光,某些服务启动失败当然也可是设置出错重启(restart_policy.condition:on-failure),另外设置resources.reservations要注意,不要超出总内存或cpu百分比,否者会导致后面服务无法获取cpu或内存资源出现“no suitable node (insufficien”错误(这个错误很奇怪,某个service不启动,也不输出日志,使用“docker stack ps [xxxx]”查看状态会显示此错误)无法启动
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。