Docker Swarm 是 Docker 提供的一种用于管理容器集群的工具。
一、Docker Swarm 的主要特点包括:
高可用性:可以自动检测和恢复故障节点,确保服务的持续可用性。
例如,当某个工作节点出现故障时,Swarm 会将其上的任务重新调度到其他健康的节点上。
负载均衡:能够在多个节点之间均衡地分配工作负载。
比如,对于一个高并发的 Web 服务,Swarm 可以根据节点的资源使用情况将请求均匀地分发到各个节点。
简单易用:基于 Docker 命令行工具,使用熟悉的 Docker 命令来管理集群。
二、管理 Docker Swarm 的关键步骤:
初始化 Swarm 集群:选择一个节点作为管理节点,并执行初始化命令。
加入工作节点:其他节点可以通过特定的命令加入到 Swarm 集群中。
创建服务:定义服务的配置,如镜像、端口、副本数量等。
三、在管理中需要注意的问题:
资源规划:合理评估和分配各个节点的资源,以避免资源不足或浪费。
网络配置:确保集群内的网络通信正常,避免出现网络隔离或延迟过高的情况。
监控和日志:建立有效的监控机制,及时发现和解决问题,并收集和分析日志以便进行故障排查和性能优化。
Docker Swarm 管理的工作原理
Docker Swarm 是 Docker 提供的一种用于容器集群管理和编排的工具。
工作原理主要包括以下几个方面:
集群初始化
管理员选择一个节点作为管理节点(Manager Node),其他节点作为工作节点(Worker Node)。
管理节点负责整个集群的管理和调度决策。
服务定义
用户定义要在集群中运行的服务,包括服务的副本数量、容器的镜像、端口映射、环境变量等。
任务调度
管理节点根据集群中节点的资源可用性和负载情况,决定在哪个工作节点上启动容器实例来运行服务。
例如,如果一个工作节点的 CPU 利用率较低,新的任务可能会被调度到该节点上。
容器部署
工作节点接收到任务后,从 Docker 镜像仓库拉取指定的镜像,并启动相应的容器实例。
络和存储管理网
Docker Swarm 提供了内置的网络和存储解决方案,确保容器之间能够相互通信和访问共享存储。
健康检查和故障恢复
定期对容器进行健康检查,如果发现某个容器故障,会自动在其他节点上重新启动新的容器实例以保持服务的副本数量。
例如,假设有一个 Web 应用服务,定义了 5 个副本。当其中一个工作节点出现故障,管理节点会感知到,并在其他正常的工作节点上启动新的容器实例,以确保始终有 5 个副本在运行,从而保证服务的高可用性。
总之,Docker Swarm 通过集中式的管理和智能的调度,使得在多个节点上部署和管理容器化应用变得更加简单和高效
部署Docker Swarm 集群,集群包含一个管理节点(manager)和两个工作节点(worker01、worker02)
部署 Docker Swarm 集群
[root@manager ~]# docker swarm init --advertise-addr 192.168.10.101
在所有worker节点加入集群
docker swarm join --token
查看集群信息
docker info
........
Swarm: active
NodeID: x3v12rmfw9c0isq1nppaaoogh
Is Manager: true
ClusterID: 0mps950k70s2oqphe75jzykqq
Managers: 1
Nodes: 3
........
查看 Swarm 集群中 Node 节点的详细状态信息
docker node ls
Docker Swarm 节点管理
将管理节点的 AVAILABILITY 值修改为 Drain 状态,使其只具备管理功能
docker node update --availability drain manager
docker node ls
节点的 AVAILABILITY 有三种状态:Active、 Pause、Drain。
Active:集群中该节点可以被指派任务。
Pause:集群中该节点不可以被指派新的任务,但是其他已经存在的任务保持运行。
Drain:集群中该节点不可以被指派新的任务,Swarm Scheduler 停掉已经存在的任务,并将它们调度到可用的节点上
添加标签元数据
[root@manager ~]# docker node update --label-add group=g2 worker01
[root@manager ~]# docker node inspect worker01
[root@manager ~]# docker service create --name mynginx --constraint 'node.labels.group==g2' nginx
查看mynginx容器所在的主机
docker service ps mynginx
节点提权/降权
将 worker01 和 worker02 都升级为管理节点
[root@manager ~]# docker node promote worker01 worker02
[root@manager ~]# docker node ls
对上面已提权的 worker01 和 worker02 执行降权操作
[root@manager ~]# docker node demote worker01 worker02
Docker Swarm 服务管理
创建好swarm群集
创建服务
使用 docker service create 命令创建 Docker 服务,从 Docker 镜像 nginx 创建一个名称为 web 的服务,指定服务副本数为 2。
docker service create -p 80:80 --replicas 2 --name web nginx
docker service logs -f web
查看当前已经部署启动的全部应用服务
docker service ls
可以查询指定服务的详细信息
docker service ps web
docker ps
显示服务详细信息
以 JSON 格式显示方法 Web 服务的详细信息
docker service inspect web
以易于阅读方式显示 Web 服务的详细信息
docker service inspect --pretty web
服务的扩容缩容
将前面已经部署的 2 个副本的 Web 服务,扩容到 3 个副本
docker service scale web=3
通过 docker service ps web 命令查看服务扩容结果
docker service ps web
删除服务
docker service rm web
5:滚动更新
docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6
docker service ps redis
添加自定义 Overlay 网络
[root@manager ~]# docker network create --driver overlay my-network
[root@manager ~]# docker service create --replicas 3 --network my-network --name myweb nginx
数据卷创建与应用
创建数据卷
[root@manager ~]# docker volume create product-kgc
将nginx容器连接到数据卷
[root@manager ~]# docker service create --mount type=volume,src=product-kgc,dst=/usr/share/nginx/html --replicas 1 --name kgc-web-01 nginx
[root@manager ~]# docker service ps kgc-web-01
到work01中查看数据是否进行同步
[root@worker01 ~]# cd /var/lib/docker/volumes/product-kgc/_data/
[root@worker01 _data]# mkdir test01 test02
[root@worker01 _data]# docker ps
[root@worker01 _data]# docker exec -it 8875962fb67b bash
root@8875962fb67b:/# ls /usr/share/nginx/html/
50x.html index.html test01 test02
使用 bind 类型挂载数据卷
(1)创建测试目录
[root@manager ~]# mkdir -p /var/vhost/www/aa
[root@worker01 ~]# mkdir -p /var/vhost/www/aa
[root@worker02 ~]# mkdir -p /var/vhost/www/aa
在manager节点安装nfs-utils
[root@manager ~]# yum -y install nfs-utils
设置nfs共享
[root@manager ~]# vim /etc/exports
/var/vhost/www/aa *(rw,sync,no_root_squash)
启动nfs服务
[root@manager ~]# systemctl start nfs
[root@manager ~]# systemctl start rpcbind
在其他work节点挂载
yum -y install nfs-utils
mount 192.168.10.101:/var/vhost/www/aa /var/vhost/www/aa/
创建 2 个 kgc-web-02 服务
[root@manager ~]# docker service create --replicas 2 --mount type=bind,src=/var/vhost/www/aa,dst=/usr/share/nginx/html/ --name kgc-web-02 nginx
验证数据是否同步
[root@worker01 _data]# touch /var/vhost/www/aa/mytest
[root@worker01 _data]# docker service ps kgc-web-02
[root@worker01 _data]# docker ps -a
[root@worker01 _data]# docker exec -it d292452b1f39 bash
root@d292452b1f39:/# ls /usr/share/nginx/html/
mytest