title: Docker系列之五:Docker 三剑客之 Docker Swarm
categories: Docker
tags:
- Docker
timezone: Asia/Shanghai
date: 2019-02-19
基本概念
节点
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。
节点分为管理 (manager) 节点和工作 (worker) 节点。
管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。
工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。
服务和任务
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
global services 每个工作节点上运行一个任务
两种模式通过 docker service create 的 --mode 参数指定。
环境
[root@centos181001 ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
[root@centos181001 ~]# docker -v
Docker version 18.09.1, build 4c52b90
#### 准备3台服务器分别安装Docker
manager 11.11.11.61
worker1 11.11.11.62
worker2 11.11.11.63
第零步:关闭系统防火墙
setenforce 0
sed -i -r "/^SELINUX=/c SELINUX=disabled" /etc/selinux/config
which systemctl && systemctl stop firewalld
which systemctl && systemctl disable firewalld
which systemctl && systemctl stop iptables || service iptables stop
which systemctl && systemctl disable iptables || chkconfig iptables off
第一步:创建一个集群
1.在manager点上初始化集群
注意:如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr 指定 IP。
docker swarm init --advertise-addr 11.11.11.61
[root@centos181001 ~]# docker swarm init --advertise-addr 11.11.11.61
Swarm initialized: current node (tbw8qskwcijuu6166xhflzk66) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-46oa6zgggs71uxoy115257g4pdryckr8tsfy39yjbdy0ym2tyc-7dzz3mo0dryx40sg0s4ti2f7s 11.11.11.61:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2.在worker节点上加入集群
docker swarm join --token SWMTKN-1-46oa6zgggs71uxoy115257g4pdryckr8tsfy39yjbdy0ym2tyc-7dzz3mo0dryx40sg0s4ti2f7s 11.11.11.61:2377
[root@centos181002 ~]# docker swarm join --token SWMTKN-1-46oa6zgggs71uxoy115257g4pdryckr8tsfy39yjbdy0ym2tyc-7dzz3mo0dryx40sg0s4ti2f7s 11.11.11.61:2377
This node joined a swarm as a worker.
3.管理命令
#### 查看swarm的当前状态(所有节点可执行)
docker info
#### 查看有关节点的信息(manager)
docker node ls
#### 在manager节点上运行以下命令以检索加入节点的join命令:
docker swarm join-token worker [--quiet]
docker swarm join-token manager [--quiet]
--quiet 只输出token
根据token的不同,我们来区分加入集群的是manager节点还是普通的节点。
第二步:部署服务
1.新建服务
docker service create --replicas 3 -p 80:80 --name nginx nginx
replicas 运行3个副本
2.查看服务
## 查看当前 Swarm 集群运行的服务。
docker service ls
[root@centos181001 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
z58wbfjpzdix nginx replicated 3/3 nginx:latest *:80->80/tcp
## 查看某个服务的详情
docker service ps nginx
[root@centos181001 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
k7q0gulkghaj nginx.1 nginx:latest centos181002 Running Running less than a second ago
xngufw4tyjik nginx.2 nginx:latest centos181003 Running Running 3 minutes ago
nbst7q6qmiyw nginx.3 nginx:latest centos181001 Running Running 3 minutes ago
## 查看某个服务的日志
docker service logs nginx -f
-f 滚动输出
3.服务增容和缩容
docker service scale nginx=5
docker service scale nginx=2
4.删除服务
docker service rm nginx