Swarm 是 Docker 引擎内置(原生)的集群管理和编排工具
学习 swarm 一定要理解的几个重要概念
- 节点
- 服务
- 任务
节点
一台物理或云主机加入 docker 集群,那么这台主机就是一个节点。
节点分为管理 (manager) 节点和工作 (worker) 节点。
管理节点用于集群的管理,一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader。
工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。
管理节点默认也作为工作节点。你也可以通过配置让工作节点只进行任务调度。
Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。
任务和服务
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。任务包含一个 Docker 容器和在容器中运行的命令。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
- replicated services(副本模式) 按照一定规则在各个工作节点上运行指定个数的任务。
- global services(全局模式) 每个工作节点上运行一个任务
两种模式通过 docker service create 的 --mode 参数指定。
swarm 集群基本操作
- 三台安装了 Docker 的主机,各主机间可以通信。
- Docker 版本必须大于 1.12
- 需要打开 tcp 2377 端口、tcp/udp 7946 端口、udp 4789 端口
- 选一台主机作为管理节点,获取其 ip 地址
docker-machine
Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在虚拟机中安装 Docker。我们还可以通过 docker-machine 命令来管理这些虚拟机和 Docker。
安装 docker-machine
- 首先下载可执行文件 https://github.com/docker/machine/releases
- 将下载好的文件移动到
/usr/local/bin/docker-machine
目录下并改名为 docker-machine - 执行
sudo chmod +x /usr/local/bin/docker-machine
命令为其添加可执行权限 - 执行如下命令,验证是否安装成功
$ docker-machine -v
docker-machine version 0.16.1, build cce350d7
初始化集群
第一步:如下命令创建 一个 Docker 主机作为管理节点。
$ docker-machine create -d virtualbox manager
由于众所周知的原因下载 boot2docker 特别慢,我们通过 boot2docker 项目页面直接下载该文件,然后将该文件移动到该 /Users/用户名/.docker/machine/cache
目录下。最后重新执行创建的命令就可以了
第二步:在管理节点上初始化一个 swarm 集群
// ssh 到虚拟机中
$ docker-machine ssh manager
// 初始化 swarm 集群,并指定管理节点 ip 地址
docker@manager:~$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
执行 docker swarm init 命令的节点自动成为管理节点。
第三步:创建工作节点,并加入 swarm 集群
worker 1
$ docker-machine create -d virtualbox worker1
$ docker-machine ssh worker1
// 工作节点初始化集群的时候会自动给出该命令。
docker@worker1:~$ docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
This node joined a swarm as a worker.
通过该 docker swarm join-token worker
命令获取加入集群的命令
worker2
$ docker-machine create -d virtualbox worker2
$ docker-machine ssh worker2
docker@worker1:~$ docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
This node joined a swarm as a worker.
第四步:查看节点状态
// 该命令只能在管理节点使用
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
jnn6cji3hy22ninkymqxer49q * manager Ready Active Leader 19.03.12
r5sce06gn9351jvotf6xp1r53 worker1 Ready Active 19.03.12
ssdfsdfs2df32dfk34dc3498 worker1 Ready Active 19.03.12
Docker 引擎通过主机名自动为节点命名
MANAGER 列标识群中的管理器节点。Leader 表示管理节点,空表示工作节点
部署一个服务
$ docker service create --replicas 1 --name helloworld busybox ping baidu.com
wo27l49vowb7reote7apzqn8d
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
- –preplicas 1 指定副本个数为 1 个(即在集群中启动一个容器运行)
- –name 指定服务名称为 helloworld
- busybox 指定镜像为 busybox
- ping baidu.com 指定运行的命令
查看当前运行的服务
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
wo27l49vowb7 helloworld replicated 1/1 busybox:latesttcp
查看服务详情
$ docker service inspect --pretty helloworld
ID: wo27l49vowb7reote7apzqn8d
Name: helloworld
Service Mode: Replicated
Replicas: 1
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Update order: stop-first
RollbackConfig:
Pa