介绍了 docker 三剑客中的 docker-machine 和 docker-compose 之后,就剩下一个 docker swarm 了。那本篇的主角就是它了。

注:环境为 CentOS7,docker 19.03。

docker-compose 为用户提供单节点中多容器的创建,docker-machine 让用户管理不同的 docker 环境。而 docker swarm 则帮助用户实现 docker 的集群管理。从单机走向集群。

Swarm 的简介

Swarm 的前身是Beam项目和libswarm项目,2014年12月推出 Swarm。之后又在2016年2月整合到 docker engine 1.12 中。使用命令 docker swarm 可以直接使用 swarm(之前是单独的命令 swarm),并支持超过 1K 个的节点。

Swarm 采用“主从”结构,通过Raft协议来在多个管理节点(Manager)中实现共识。⼯作节点(Worker) 上运⾏agent接受管理节点的统⼀管理和任务分配。 ⽤户提交服务请求只需要发给管理节点即可, 管理节点会按照调度策略在集群中分配节点来运⾏服务相关的任务。

在Swarm V2中, 集群中会⾃动通过Raft协议分布式选举出Manager节点, ⽆须额外的发现服务⽀持, 避免了单点瓶颈。 同时, V2中内置了基于DNS的负载均衡和对外部负载均衡机制的集成⽀持。

Swarm 基本概念

swarm 集群

Swarm集群(Cluster) 为⼀组被统⼀管理起来的Docker主机。 集群是Swarm所管理的对象。 这些主机通过Docker引擎的Swarm模式相互沟通,其中部分主机可能作为管理节点(manager) 响应外部的管理请求, 其他主机作为⼯作节点(worker) 来实际运⾏Docker容器。 当然, 同⼀个主机也可以即作为管理节点, 同时作为⼯作节点。

当⽤户使⽤Swarm集群时, ⾸先定义⼀个服务(指定状态、 复制个数、 ⽹络、 存储、 暴露端口等) , 然后通过管理节点发出启动服务的指令, 管理节点随后会按照指定的服务规则进⾏调度, 在集群中启动起来整个服务, 并确保它正常运⾏。

节点

节点(Node) 是Swarm集群的最⼩资源单位。 每个节点实际上都是⼀台Docker主机。通过命令 docker node [COMMAND] 可以管理节点。

Swarm集群中节点分为两种:

  • 管理节点(manager node) : 负责响应外部对集群的操作请求, 并维持集群中资源, 分发任务给⼯作节点。 同时, 多个管理节点之间通过Raft协议构成共识。 ⼀般推荐每个集群设置5个或7个管理节点;
  • ⼯作节点(worker node) : 负责执⾏管理节点安排的具体任务。 默认情况下, 管理节点⾃⾝也同时是⼯作节点。 每个⼯作节点上运⾏代理(agent) 来汇报任务完成情况。⽤户可以通过docker node promote命令来提升⼀个⼯作节点为管理节点; 或者通过docker node demote命令来将⼀个管理节点降级为⼯作节点。

服务

服务(Service) 是Docker⽀持复杂多容器协作场景的利器。docker service [COMMAND],该命令可以用来操作服务。

⼀个服务可以由若⼲个任务组成, 每个任务为某个具体的应⽤。 服务还包括对应的存储、 ⽹络、 端口映射、 副本个数、 访问配置、 升级配置等附加参数。

⼀般来说, 服务需要⾯向特定的场景, 例如⼀个典型的Web服务可能包括前端应⽤、 后端应⽤, 以及数据库等。 这些应⽤都属于该服务的管理范畴。

Swarm集群中服务类型也分为两种(可以通过-mode指定) :

  • 复制服务(replicated services) 模式: 默认模式, 每个任务在集群中会存在若⼲副本, 这些副本会被管理节点按照调度策略分发到集群中的⼯作节点上。 此模式下可以使⽤ --replicas 参数设置副本数量;
  • 全局服务(global services) 模式: 调度器将在每个可⽤节点都执⾏⼀个相同的任务。 该模式适合运⾏节点的检查, 如监控应⽤等。

任务

任务是Swarm集群中最⼩的调度单位, 即⼀个指定的应⽤容器。 例如仅仅运⾏前端业务的前端容器。 任务从⽣命周期上将可能处于创建(NEW) 、 等待(PENDING) 、 分配(ASSIGNED) 、 接受(ACCEPTED) 、 准备(PREPARING) 、 开始(STARTING) 、 运⾏(RUNNING) 、 完成(COMPLETE) 、 失败(FAILED) 、 关闭(SHUTDOWN) 、 拒绝(REJECTED) 、 孤⽴(ORPHANED) 等不同状态。

Swarm集群中的管理节点会按照调度要求将任务分配到⼯作节点上。例如指定副本为2时, 可能会被分配到两个不同的⼯作节点上。 ⼀旦当某个任务被分配到⼀个⼯作节点, 将⽆法被转移到另外的⼯作节点, 即Swarm中的任务不⽀持迁移。

swarm 外部访问

Swarm集群中的服务要被集群外部访问, 必须要能允许任务的响应端⼜映射出来。 Swarm中⽀持⼊⼜负载均衡(ingress load balancing) 的映射模式。 该模式下, 每个服务都会被分配⼀个公开端⼜(PublishedPort) ,该端⼜在集群中任意节点上都可以访问到, 并被保留给该服务。

当有请求发送到任意节点的公开端口时, 该节点若并没有实际执⾏服务相关的容器, 则会通过路由机制将请求转发给实际执⾏了服务容器的⼯作节点。

使用 docker swarm

环境上使用的 docker 版本为 19.03,已经集成了 swarm,所以直接使用 docker swarm

准备三台机器,配置如下:

  • manager:CentOS7 192.168.10.10 docker19.03
  • work1:CentOS7 192.168.10.11 docker19.03
  • work2:CentOS7 192.168.10.12 docker19.03

创建 docker swarm 集群

docker 集群的操作命令如下:

  • swarm init: 在管理节点上创建⼀个集群;
  • node list: 列出集群中的节点信息;
  • swarm join: 加⼊⼀个新的节点到已有集群中;
  • swarm update: 更新⼀个Swarm集群;
  • swarm leave: 离开⼀个Swarm集群。

1.创建 swarm 集群

# docker swarm init
Swarm initialized: current node (64ziftvcc42jes9rjjln3gj3o) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-05ti4zj7p0jnhxl26m3tlk48aazl3ts3jkhari0c4oyaoxk1rb-bb3dkm45d9m0ikaoxuhgwtgve 192.168.10.10:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

2.在两台 work 节点上执行如下命令

# docker swarm join --token SWMTKN-1-05ti4zj7p0jnhxl26m3tlk48aazl3ts3jkhari0c4oyaoxk1rb-bb3dkm45d9m0ikaoxuhgwtgve 192.168.10.10:2377

这样,就完成了 docker swarm 集群的创建了,还是很简单的

# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
64ziftvcc42jes9rjjln3gj3o * centos1 Ready Active Leader 19.03.1
60xwt9dr0znx5qnjhvjqj9c7w centos2 Ready Active 19.03.1
h7zaxx1bxzw33mp8ze6lumj4f centos3 Ready Active 19.03.1

注意:如果 CentOS7 上防火墙没有配置的话,集群中的节点状态可以会为 down,请先关闭或开放端口2377

使用 docker swarm 集群

创建集群使用命令 docker swarm [COMMAND],管理集群使用docker node [COMMAND],利用集群管理服务则是命令 docker service [COMMAND]

1.创建一个服务

# docker service create --replicas 2 --name ping debian:jessie ping docker.com
skyaj8ukmi8t42c05qba3k6rm
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged

2.查看一个服务

# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
skyaj8ukmi8t ping replicated 2/2 debian:jessie
# docker service ps ping
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
x02dsx5to2xq ping.1 debian:jessie centos1 Running Running about a minute ago
3od5f9rzjjzt ping.2 debian:jessie centos2 Running Running about a minute ago
# docker service inspect --pretty ping ID: skyaj8ukmi8t42c05qba3k6rm
Name: ping
Service Mode: Replicated
Replicas: 2
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Update order: stop-first
RollbackConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Rollback order: stop-first
ContainerSpec:
Image: debian:jessie@sha256:c72197393c39c05e19c8ef3388af53a6daa2baa0bed6111b09e40a298d9f7eca
Args: ping docker.com
Init: false
Resources:
Endpoint Mode: vi

3.扩展服务

# docker service scale ping=1
ping scaled to 1
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
# docker service scale ping=3
ping scaled to 3
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged

4.使用外部端口

# docker service create --replicas 2 --name nginx -p 8080:80 nginx

或者

# docker service create --replicas 2 --name nginx --publish published=8080,target=80 nginx

注:docker swarm 内部已经实现负载均衡,访问 swarm 集群任意节点的地址都有效,即使该节点没有运行该服务。

5.service 子命令

swarm 节点管理

管理 swarm 集群节点的命令是 docker node,支持以下选项

  • demote:从管理节点切换为工作节点
  • inspect:查看节点
  • ls:输出所有节点
  • promote:从工作节点切换为管理节点
  • ps:输出节点上的任务信息
  • rm:从集群中删除节点
  • update:更新节点信息

swarm 部署多任务

之前我们已经使用过 docker-compose,它能在一次部署多个容器,现在 docker engine 中集成了同样的能,而且能在 swarm 集群环境下部署多个任务。

命令docker stack [command]命令支持以下选项:

  • deploy:部署一个 stack
  • ls:输出所有的 stack
  • ps:输出 stack 中的任务
  • rm:删除一个stack
  • services:输出stack中所有服务

1.创建 docker-compose.yml

docker stack 直接支持 docker-compose 格式的配置文件

version: "3"

services:
nginx:
image: nginx:latest
ports:
- 8088:80
deploy:
mode: replicated
replicas: 4

2.部署 stack

# docker stack deploy -c docker-compose.yml web
Creating service web_nginx
# docker stack ls
NAME SERVICES ORCHESTRATOR
web 1 Swarm
# docker stack ps web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
q34tk96cssvp web_nginx.1 nginx:latest centos1 Running Running 6 seconds ago
k6p4iol3vs0v web_nginx.2 nginx:latest centos2 Running Running 7 seconds ago
hen5phupzow4 web_nginx.3 nginx:latest centos2 Running Running 7 seconds ago
ugr8sgg6lpv9 web_nginx.4 nginx:latest centos3 Running Running 6 seconds ago
# docker stack services web
ID NAME MODE REPLICAS IMAGE PORTS
hf5dbvn0a8ww web_nginx replicated 4/4 nginx:latest *:8088->80/tcp

3.删除 stack

# docker stack rm web
Removing service web_nginx
Removing network web_default

docker 实践九:docker swarm的更多相关文章

  1. centos7+ docker 实践部署docker及配置direct_lvm

    转载于博客园:http://www.cnblogs.com/Andrew-XinFei/p/6245330.html 前言 Docker现在在后端是那么的火热..尤其当笔者了解了docker是什么.能 ...

  2. Docker实践 - 安装Docker并在容器里运行tomcat

    安装Docker yum install docker 本文使用的系统是centos7,ubuntu使用以下命令 sudo apt-get update sudo apt-get install do ...

  3. Docker(十九)-Docker监控容器资源的占用情况

    启动一个容器并限制资源 启动一个centos容器,限制其内存为1G ,可用cpu数为2 [root@localhost ~]# docker run --name os1 -it -m 1g --cp ...

  4. Docker实践3: Docker常用命令(未完)

    查看容器及运行进程 docker ps 查看容器内部信息 docker inspect container_id 进入容器 docker attach container_id 退出容器 docker ...

  5. Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享

    架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要 ...

  6. docker进阶-利用dcoker Swarm搭建简单集群

    什么是Swarm   在介绍Swarm之前我们要说一下什么Docker三剑客? Docker-Machine:负责在多种平台上快速安装 Docker 环境. Docker-Compose:Docker ...

  7. Docker(六):Docker 三剑客之 Docker Swarm

    实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容器集群系统,我们该如何选择 ...

  8. centos7+ docker1.12 实践部署docker及配置direct_lvm

    前言 Docker现在在后端是那么的火热..尤其当笔者了解了docker是什么.能做什么之后,真的是感觉特别的exciting,便迫不及待的去实践部署一下. 但是在实际部署中,因为笔者使用的是阿里云e ...

  9. Docker 三剑客之 Docker Swarm

    上一篇:Docker 三剑客之 Docker Compose 阅读目录: Docker Machine 创建 Docker 主机 Docker Swarm 配置集群节点 Docker Service ...

随机推荐

  1. 登录注册页面模板汇总WEB前端(50套)

    土地指标管理系统入口登录页面 土地指标管理系统入口登录页面.zip: https://u18740809.pipipan.com/fs/18740809-382374353 紫色响应式登录页面模板 紫 ...

  2. 深度学习面试题05:激活函数sigmod、tanh、ReLU、LeakyRelu、Relu6

    目录 为什么要用激活函数 sigmod tanh ReLU LeakyReLU ReLU6 参考资料 为什么要用激活函数 在神经网络中,如果不对上一层结点的输出做非线性转换的话,再深的网络也是线性模型 ...

  3. 请你谈谈Cookie的弊端

    a. 每个特定的域名下最多生成的cookie个数有限制 b. IE和Opera 会清理近期最少使用的cookie,Firefox会随机清理cookie c. cookie的最大大约为4096字节,为了 ...

  4. Hive跨集群迁移

    Hive跨集群迁移数据工作是会出现的事情, 其中涉及到数据迁移, metastore迁移, hive版本升级等. 1. 迁移hdfs数据至新集群hadoop distcp -skipcrccheck ...

  5. 设计input搜索框提示文字点击消失的效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 封装Email相关的操作

    package com.opslab.util; import javax.activation.DataHandler;import javax.activation.DataSource;impo ...

  7. linux中导入sql文件

    在linux中导入sql文件的方法分享(使用命令行转移mysql数据库) 因导出sql文件 在你原来的网站服务商处利用phpmyadmin导出数据库为sql文件,这个步骤大家都会,不赘述. 上传sql ...

  8. Eclipse注释模版

    打开Window->Preferences->Java->Code Style->Code Templates 点击"Import",导入模板codetem ...

  9. oracle存储过程(带参数的存储过程)

    带参数的存储过程 举例:为指定的员工涨100元的工资,打印涨前和涨后的工资 如果带参,需要指定是输入参数还是输出参数 create or replace procedure raisesalary(e ...

  10. array_map array_walk

    $config = [ => [], => [], => [] ]; array_map(function($key) use ($config){ print_r($key); d ...