Docker从入门到精通之Docker Swarm集群
作者 |上海滩虎哥
来源 | 今日头条
Swarm是什么?
Docker Swarm是运行在Docker应用程序上的编排管理工具。它帮助最终用户创建和部署Docker节点集群。
swarm由多个Docker主机组成,这些主机以swarm模式运行,充当manager和worker(运行swarm服务)。Docker主机可以是manager、worker,也可以同时执行这两个角色。创建服务时,需要定义其最佳状态(副本数量、可用的网络和存储资源、服务对外公开的端口等)。如果工作节点不可用,Docker会在其他节点上安排该节点的任务。任务是一个正在运行的容器,它是swarm服务的一部分,由swarm manager管理,而不是独立的容器。
swarm services相对于独立容器的一个关键优势是,您可以修改服务的配置,包括它连接的网络和卷,而无需手动重新启动服务。Docker将更新配置,停止配置过期的服务任务,并创建与所需配置匹配的新任务。
当Docker在swarm模式下运行时,您仍然可以在参与swarm的任何Docker主机以及swarm服务上运行独立容器。独立容器和swarm服务之间的一个关键区别是,只有swarm管理员可以管理swarm,而独立容器可以在任何守护程序上启动。Docker守护进程可以作为管理者、工作者或两者兼而有之的身份参与群集。
节点Nodes
节点是参与swarm的Docker引擎的一个实例。也可以将其视为Docker节点。您可以在一台物理计算机或云服务器上运行一个或多个节点,但生产群部署通常包括分布在多台物理和云计算机上的Docker节点。
要将应用程序部署到swarm,需要向manager节点提交服务定义。manager节点将称为tasks的工作单元分派给worker节点。
管理器节点还执行编排和集群管理功能,以维持群的所需状态。管理器节点选择一个Leader来执行编排任务。
Worker节点接收并执行从管理器节点分派的任务。默认情况下,管理器节点还可以作为工作节点运行服务,但您可以将它们配置为以独占方式运行管理器任务,并且仅作为管理器节点。代理在每个工作节点上运行,并报告分配给它的任务。worker节点将其分配的任务的当前状态通知manager节点,以便manager可以保持每个worker的所需状态。
Services 和 tasks
Services是在manager或worker节点上执行的任务的定义。它是swarm系统的中心结构,也是用户与swarm交互的主要根源。
创建服务时,需要指定要使用的容器镜像以及要在运行的容器中执行的命令。
任务包含一个Docker容器和要在容器内运行的命令。它是swarm的原子调度单元。管理器节点根据服务规模中设置的副本数量将任务分配给工作节点。任务一旦分配给一个节点,就不能移动到另一个节点。它只能在分配的节点上运行,否则将失败。
Load balancing
swarm manager使用ingress load balancing向swarm外部公开您希望提供的服务。swarm manager可以自动为该服务分配一个PublishedPort,也可以为该服务配置一个PublishedPort。您可以指定任何未使用的端口。如果未指定端口,swarm manager会为服务分配30000-32767范围内的端口。
外部组件(如云负载平衡器)可以访问群集中任何节点的PublishedPort上的服务,无论该节点当前是否正在运行该服务的任务。swarm中的所有节点将入口连接路由到正在运行的任务实例。
Swarm模式有一个内部DNS组件,可以自动为Swarm中的每个服务分配一个DNS条目。swarm manager使用内部负载平衡,根据服务的DNS名称在集群内的服务之间分配请求。
Swarm集群实践
准备三台主机,ip分别为192.168.56.101、192.168.56.102、192.168.56.103
创建swarm
docker swarm初始化
$ docker swarm init
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses
on different interfaces (192.168.56.101 on enp0s3 and 10.0.3.15 on enp0s8) - specify one with --advertise-addr
以上出现错误,原因是虚拟机有多个网卡,无法指定广播IP,指定一个IP即可
$ docker swarm init --advertise-addr 192.168.56.101
Swarm initialized: current node (weflj8yrlj1ph0p5qh7e0b90l) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1dnr4yf5c667j78htj7ruxd0mhn76ahpjopduv8qxijwtcb3wm-5v80900g5m319ubr3ntuxi5gy 192.168.56.101:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
添加节点到swarm
在主机为192.168.56.102、192.168.56.103上执行以下命令,将节点加入到swarm
$ docker swarm join --token SWMTKN-1-1dnr4yf5c667j78htj7ruxd0mhn76ahpjopduv8qxijwtcb3wm-5v80900g5m319ubr3ntuxi5gy 192.168.56.101:2377
查看管理节点和worker节点token指令
1、获取管理者口令:docker swarm join-token manager查看manager token
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1dnr4yf5c667j78htj7ruxd0mhn76ahpjopduv8qxijwtcb3wm-6ey24kf6hqe7y9e58jkq128d0 192.168.56.101:2377
然后复制口令到其它服务器执行,则加入到swarm集群作为manager节点
$ docker swarm join --token SWMTKN-1-1dnr4yf5c667j78htj7ruxd0mhn76ahpjopduv8qxijwtcb3wm-6ey24kf6hqe7y9e58jkq128d0 192.168.56.101:2377
2、获取worker口令:docker swarm join-token worker查看worker token
$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1dnr4yf5c667j78htj7ruxd0mhn76ahpjopduv8qxijwtcb3wm-5v80900g5m319ubr3ntuxi5gy 192.168.56.101:2377
然后复制口令到其它服务器执行,则加入到swarm集群作为worker节点
$ docker swarm join --token SWMTKN-1-1dnr4yf5c667j78htj7ruxd0mhn76ahpjopduv8qxijwtcb3wm-5v80900g5m319ubr3ntuxi5gy 192.168.56.101:2377
更多Docker实战包好Nignx集群、redis集群、mysql集群等将陆续发布,请大家关注!