docker 实践八:docker swarm

介绍了 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:[email protected]: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

原文地址:https://www.cnblogs.com/xingyys/p/11443629.html

时间: 2024-08-28 16:58:46

docker 实践八:docker swarm的相关文章

Docker实践(六):Docker Swarm

环境说明: 主机名 操作系统版本 IP地址 docker版本 说明 manager Ubuntu 16.04.5 172.27.9.71 18.09.2 manager管理主机 work01 Ubuntu 16.04.5 172.27.9.75 18.09.2 worker主机01 work02 Ubuntu 16.04.5 172.27.9.76 18.09.2 worker主机02 本文所有测试都在Vmware虚拟机(版本为12.5.2)上完成ubuntu安装详见:Ubuntu16.04.5

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

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

Docker 实践 01 Docker安装

ubuntu安装Docker 1.安装curl工具 copy #apt-get update   #apt-get install curl 2.通过脚本安装docker copy #curl -fsSL get.docker.com -o get-docker.sh   #sh get-docker.sh --mirror Aliyun 3.配置镜像加速器 #curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s htt

Docker(十八)-Docker配置DNS

Linux系统配置DNS的时候有一个问题,就是你在/ect/resolv.conf文件中添加上nameserver XXX.XXX.XXX.XXX的时候,当时是生效的,但是机器重启之后就失效了,所以我们可以通过配置Network的方法来解决,但是对于docker来说,它默认是映射主机的DNS,但是如果你想在docker镜像中加上非主机的DNS,也许这个方法就解决不了问题,但是对于docker来说有两种方法来解决这个DNS的问题: 一.当我们希望我们run起来镜像的时候,/ect/resolv.c

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

架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要实现技术.但目前技术还不够成熟,在生产实践中会遇到不少坑.本期参与小组交流的是国内较早采用 Docker 实践的公司. 参与嘉宾:沪江架构师黄凯.滴滴架构师田智伟.蘑菇街架构师张振华.蘑菇街运维架构师向靖.七牛技术总监袁晓沛.扇贝技术总监丁彦 第一轮:自由交流 沪江黄凯:大家好,我是来自沪江的 Ja

Docker实践(4)—network namespace与veth pair

network namespace 创建network namespace # ip netns add blue # ip netns list blue 添加网口到namespace 先创建veth # ip link add veth0 type veth peer name veth1 在当前namespace可以看到veth0和veth1 # ip link list 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue stat

在(Docker里的)Jenkins里运行Docker实践

按照在(Docker里的)Jenkins里运行Docker( http://www.dockone.io/article/431)进行实践. 通过该文章,可以快速了解如何在一个容器(这里是Jenkins容器)里装载Docker sock以便创建其"兄弟"容器,有人称之为DooD(Docker-outside-of-Docker),以区别于DinD(Docker-in-Docker),后者是在容器中安装一个完整的隔离的Docker版本. 当然,也可以在Jenkins容器中使用Docker

Docker实践(3)—浅析device mapeper的thin provoision

thin provision是在 kernel3.2 中引入的.它主要有以下一些特点: (1)允许多个虚拟设备存储在相同的数据卷中,从而达到共享数据,节省空间的目的: (2)支持任意深度的快照.之前的实现的性能为O(n),新的实现通过一个单独的数据避免了性能随快照深度的增加而降低. (3)支持元数据存储到单独的设备上.这样就可以将元数据放到镜像设备或者更快的SSD上. 上面3个特性正是devicemapper支持docker存储镜像的关键特性. 使用lvm管理thin provisioning

Docker实践(1)—入门

tutorial centos6.5环境. # yum install docker-io -y 会依赖安装libcgroup,lxc,lxc-libs 启动docker # service docker start Starting cgconfig service: [确定] Starting docker:        [确定] 获取最新的docker image # docker pull centos:latest 运行image # docker run -i -t centos