在Docker应用越来越深入的今天,把调度粒度停留在单个容器上是非常没有效率的。同样地,在提高对Docker宿主机管理效率和利用率的方向上,集群化管理方式是一个正确的选择。是时候从更高的抽象层次上使用Docker了,Swarm就是将多宿台主机抽象为“一台”的工具。
目前传统的(没有集群管理工具)
有了Swarm后,使用多台Docker宿主机的方式就变成了图
Swarm最大程度兼容Docker的远程API,目前为止,Swarm已经能够支持95%以上的Docker远程API,这使得所有直接调用Docker远程API的程序能方便地将后端替换为Swarm,这类程序包括Docker官方客户端,以及Fig、Flynn和Deis这类集群化管理使用Docker的工具。
Swarm除了在多台Docker宿主机(或者说多个Docker服务端)上建立一层抽象外,还提供对宿主机资源的分配和管理。Swarm通过在Docker宿主机上添加的标签信息来将宿主机资源进行细粒度分区,通过分区来帮助用户将容器部署到目标宿主机上,同样通过分区方式还能提供更多的资源调度策略扩展。
现阶段Swarm依然处于初期开发过程中,对Docker镜像的操作,以及更复杂的调度策略等方向上,还没有形成Production Ready的实现,因此本书对Swarm使用只体现在几个核心功能上。对于一个Swarm集群,集群内节点分成Swarm Agent和Swarm Manager两类。Agent节点运行Docker服务端,Docker Release的版本需要保证一致,且为1.4.0或更新的版本。Manager节点负责与所有Agent上的Docker宿主机通信以及对外提供Docker远程API服务,因此Manager需要能获取到所有Agent地址。实现方式可以是让所有Agent到网络上的某个位置注册,Manager到相同的地址获取最新的信息,这样Agent节点的活动就可以被实时侦测;也可以是事先将所有Agent的信息写在Manager节点的一个本地文件中,但这种实现无法再动态地为集群增加Agent节点。
获取swarm镜像
sudo docker pull swarm
初始化swarm,搭建单机版swarm环境
sudo docker swarm init
如果要集成集群环境
[root@iZuf6bm702o3rrjlhq9xt5Z ~]# docker swarm init --advertise-addr 172.29.227.255
Swarm initialized: current node (k7uveh6ie7dkl19nef8770d6k) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5whmzfu54ttj6n24llboq0vppp0v1j2u9weqoob5yjt9hx4jie- bmab0o7f7ur2i99dhbvux6923 172.29.227.255:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
当swarm创建成功之后会生成一个token SWMTKN-1-5whmzfu54ttj6n24llboq0vppp0v1j2u9weqoob5yjt9hx4jie- bmab0o7f7ur2i99dhbvux6923 172.29.227.255:2377
查看当前集群信息
sudo docker info
[root@iZuf6bm702o3rrjlhq9xt5Z ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.8.2-docker)
scan: Docker Scan (Docker Inc., v0.17.0)
Server:
Containers: 10
Running: 0
Paused: 0
Stopped: 10
Images: 4
Server Version: 20.10.17
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: false
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active
NodeID: k7uveh6ie7dkl19nef8770d6k
Is Manager: true
ClusterID: 5iwn6asj14aqwv6qrgb8ip4c3
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
此处可以看到有clinet,server,swarm等节点key, swarm的状态是active
查看当前swarm成员结点
sudo docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
k7uveh6ie7dkl19nef8770d6k * iZuf6bm702o3rrjlhq9xt5Z Ready Active Leader 20.10.17
新建一个service,命名为:test
sudo docker service create --replicas 1 --name test alpline ping docker.com