介绍

Docker Swarm 是 Docker 公司推出的官方容器集群平台,基于 Go 语言实现

作为容器集群管理器,Swarm 最大的优势之一就是 100% 支持标准的 Docker API。各种基于标准 API 的工具比如 Compose、docker-py、各种管理软件,甚至 Docker 本身等都可以很容易的与 Swarm 进行集成。这大大方便了用户将原先基于单节点的系统移植到 Swarm 上。

基本概念

节点:

运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。

节点分为管理 (manager) 节点和工作 (worker) 节点。

管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leaderleader 通过 raft 协议实现。

工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

服务和任务

任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。

服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

  • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。

  • global services 每个工作节点上运行一个任务

两种模式通过 docker service create 的 --mode 参数指定。

创建 Swarm 集群

关闭防火墙

[root@master ~]# systemctl stop firewalld.service
[root@master ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.

官网示例

[root@master ~]# docker swarm init --advertise-addr 192.168.132.148
Swarm initialized: current node (4c6iv7adv3ha0ejho0f9pu3na) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \
--token SWMTKN-1-2pf6s6myfdn9yx6lekinmvnqmen0vyce8s32bacxw2mdlem30r-d6ch6wkkisacoihs1byrjf0e1 \
192.168.132.148:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. [root@master ~]# netstat -ntlp |grep 2377
tcp6 0 0 :::2377 :::* LISTEN 2220/dockerd

#节点一
[root@slave1 ~]# docker swarm join --token SWMTKN-1-2pf6s6myfdn9yx6lekinmvnqmen0vyce8s32bacxw2mdlem30r-d6ch6wkkisacoihs1byrjf0e1 192.168.132.148:2377
This node joined a swarm as a worker. #节点二
[root@slave2 ~]# docker swarm join --token SWMTKN-1-2pf6s6myfdn9yx6lekinmvnqmen0vyce8s32bacxw2mdlem30r-d6ch6wkkisacoihs1byrjf0e1 192.168.132.148:2377
This node joined a swarm as a worker.

docker swarm 命令

    命令                   说明
docker swarm init          初始化集群
docker swarm join-token worker 查看工作节点的 token
docker swarm join-token manager 查看管理节点的 token
docker swarm join          加入集群中

查看集群

[root@master ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4c6iv7adv3ha0ejho0f9pu3na * master Ready Active Leader
ezr1hf1prwzuisbjquhtd8qsq slave1 Ready Active
s9wxeakddde48z212r09j9zga slave2 Ready Active

docker node 命令

      命令              说明
docker node ls      查看所有集群节点
docker node rm      删除某个节点(-f强制删除)
docker node inspect   查看节点详情
docker node demote   节点降级,由管理节点降级为工作节点
docker node promote   节点升级,由工作节点升级为管理节点
docker node update   更新节点
docker node ps      查看节点中的 Task 任务

部署服务

$ docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine

现在我们使用浏览器,输入任意节点 IP ,即可看到 nginx 默认页面。

查看service

[root@master ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
71vkd0ywfphg nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp

查看服务详情

[root@master ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
nikyvqah8k5n nginx.1 nginx:latest slave2 Running Preparing 3 minutes ago
7fjgztll22f7 nginx.2 nginx:latest master Running Preparing 35 seconds ago
gyl1vb9nguzs nginx.3 nginx:latest slave1 Running Preparing less than a second ago

查看日志

[root@master ~]# docker service logs nginx

服务扩容与缩减

#扩容
$ docker service scale nginx=5 #缩减
$ docker service scale nginx=2

删除服务

[root@master ~]# docker service rm nginx
nginx
[root@master ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

docker service命令

     命令             说明
docker service create   部署服务
docker service inspect  查看服务详情
docker service logs    产看某个服务日志
docker service ls     查看所有服务详情
docker service rm     删除某个服务(-f强制删除)
docker service scale   设置某个服务个数
docker service update   更新某个服务

使用docker-compose

[root@master ~]# cat docker-compose.yml
version: "" services:
wordpress:
image: wordpress
ports:
- 80:80
networks:
- overlay
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
deploy:
mode: replicated
replicas: 3 db:
image: mysql
networks:
- overlay
volumes:
- db-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
deploy:
placement:
constraints: [node.role == manager] visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager] volumes:
db-data:
networks:
overlay: #部署服务使用 docker stack deploy,其中 -c 参数指定 compose 文件名。
[root@master ~]# docker stack deploy -c docker-compose.yml wordpress
Creating network wordpress_default
Creating network wordpress_overlay
Creating service wordpress_visualizer
Creating service wordpress_wordpress
Creating service wordpress_db

docker stack 常用命令

     命令              说明
docker stack deploy   部署新的堆栈或更新现有堆栈
docker stack ls      列出现有堆栈
docker stack ps      列出堆栈中的任务
docker stack rm      删除堆栈
docker stack services 列出堆栈中的服务
docker stack down    移除某个堆栈(不会删除数据)

现在我们打开浏览器输入 任一节点IP:8080 即可看到各节点运行状态。如下图所示:

滚动升级

使用上面创建的nginx服务作为基础

#升级
$ docker service update --image nginx:1.13.12-alpine nginx #如果升级后发生问题,回退
$ docker service rollback nginx

swarm过滤器

过滤器分为两类,节点过滤器和容器配置过滤器。节点过滤器根据Docker主机的特性或Docker守护程序的配置进行操作。容器配置过滤器根据容器的特征或主机上的image可用性进行操作。

每个过滤器都有一个标识它的名称。节点过滤器是:

  • constraint   #用来选择进行调度的节点子集

  • health
  • containerslots

容器配置过滤器是:

  • affinity
  • dependency
  • port

使用过滤器时,通过传递--filter标志和名称来指定过滤的子集

$ swarm manage --filter=health --filter=dependency      #包括已经停止的容器

示例将某镜像拉倒某个节点上

$ docker -H node-: pull redis
$ docker -H node-: pull mysql
$ docker -H node-: pull redis

constraint

以下示例说明了一些可能的表达式:

constraint:node==node1      匹配节点node1。
constraint:node!=node1      匹配所有节点,除了node1。
constraint:region!=us*      使用带有region前缀的标记匹配外部的所有节点us。
constraint:node==/node[]/   匹配节点node1和node2。
constraint:node==/node\d/    匹配所有节点node+ 1位数。
constraint:node!=/node-[]/  匹配所有节点,除了node-0和node-1。
constraint:node!=/foo\[bar\]/  匹配所有节点,除了foo[bar]。你可以在这里看到转义字符的使用。
constraint:node==/(?i)node1/  匹配节点node1不区分大小写。所以NoDe1还是NODE1匹配。
affinity:image==~redis      尝试匹配运行容器的节点与redis图像。
constraint:region==~us*      搜索属于该us区域的群集中的节点。
affinity:container!=~redis*    将新redis5容器安排到没有满足容器的节点redis*。

根据节点daemon中设置的标签名来选择启用的节点

version: ""

services:
mongodb:
image: mongo:latest
environment:
- "constraint:com.example.storage==ssd"      #指定标签为ssd的节点 #这里表示在docker的启动配置文件中设定如下标签
DOCKER_OPTS="$DOCKER_OPTS --label com.example.environment='production' --label com.example.storage="ssd" "

可以使用集群节点的名称来启动,省去了配置 label。

docker service create --name xxx --constraint node.hostname==swarm1 xxx

docker swarm(当前官网示例)的更多相关文章

  1. FineUI(开源版)v4.2.2发布(8年125个版本,官网示例突破300个)!

    开源版是 FineUI 的基石,从 2008 年至今已经持续发布了 120 多个版本,拥有会员 15,000 多位,捐赠会员达到 1,200 多位.   FineUI(开源版)v4.2.2 是 8 年 ...

  2. [踩过的坑]Elasticsearch.Net 官网示例的坑

    经过昨天的ElasticSearch 安装,服务以及可以启动了,接下来就可以开发了,找到了官网提供的API以及示例,Es 官方提供的.net 客户端有两个版本一个低级版本: [Elasticsearc ...

  3. Leaflet_创建地图(官网示例,可以直接运行)(2017-10-20)

    官网:http://leafletjs.com/examples.html 快速启动指南 http://leafletjs.com/examples/quick-start/example.html ...

  4. Scrapy的【SitemapSpider】的【官网示例】没有name属性

    Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 上午看了Scrapy的Spiders官文,并按照其中的SitemapSpider的示例练习,发现官文的示例存在问题 ...

  5. Ubuntu安装docker(摘自官网,自用)

    在 Ubuntu 上安装 Docker 引擎(按照标红顺序执行命令) 预计阅读时间:11分钟 适用于 Linux 的 Docker 桌面 Docker Desktop 可帮助您在 Mac 和 Wind ...

  6. MySQL官网示例数据库emploees分析使用

    1.下载与安装 下载地址:https://github.com/datacharmer/test_db 安装博客:https://blog.csdn.net/appleyuchi/article/de ...

  7. Scrapy官网程序执行示例

    Windows 10家庭中文版本,Python 3.6.4,Scrapy 1.5.0, Scrapy已经安装很久了,前面也看了不少Scrapy的资料,自己尝试使其抓取微博的数据时,居然连登录页面(首页 ...

  8. Vue官网todoMVC示例

    这个示例是模仿官网示例样式和功能用我自己的方式写的,基本上没有看官网的源码,只参考自定义指令.让我们一步步来探讨一下.官网demo 要实现的功能 单条添加todo 单条删除todo 双击编辑todo ...

  9. 非节点主机通过内网远程管理docker swarm集群

    这是今天使用 docker swarm 遇到的一个问题,终于在睡觉前解决了,在这篇随笔中记录一下. 在 docker swarm 集群的 manager 节点上用 docker cli 命令可以正常管 ...

随机推荐

  1. Tyche 2191 WYF的递推式

    题目描述 WYF手中有这样一条递推式 WYF并不是想让你帮他做出结果,事实上,给定一个n,他能够迅速算出Fn.WYF只是想单纯的考验一下读者们. 输入描述 仅一行,三个整数N,F1,P 输出描述 仅一 ...

  2. notepad++上直接运行python文件

    一.打开notepad++,点击语言,选择python,这样就写的是python文件了 二.点击运行>运行:输入cmd /k python "$(FULL_CURRENT_PATH)& ...

  3. BZOJ2738矩阵乘法——整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入   第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...

  4. BZOJ2150部落战争——最小路径覆盖

    题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一 个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb ...

  5. 洛谷P1462通往奥格瑞玛的道路题解

    [题目]: https://www.luogu.org/problemnew/show/P1462 题意 题目是给定了一张双向边,有边权的图,然后让我们求出一个最小值,满足一条路径上的最大的费用小于这 ...

  6. python主流测试框架的简介

    1.python自动化的一些测试框架 1).unitest(也称为PyUnit)  地址:https://docs.python.org/2/library/unittest.html 2).Nose ...

  7. c# Redis 使用

    1.服务端两个版本窗口版与安装windows服务版 1.1.窗口版 下载地址:https://github.com/dmajkic/redis/downloads redis-server.exe:服 ...

  8. 【CF487E】Tourists(圆方树)

    [CF487E]Tourists(圆方树) 题面 UOJ 题解 首先我们不考虑修改,再来想想这道题目. 我们既然要求的是最小值,那么,在经过一个点双的时候,走的一定是具有较小权值的那一侧. 所以说,我 ...

  9. HDU 5950 Recursive sequence(矩阵快速幂)

    题目链接:Recursive sequence 题意:给出前两项和递推式,求第n项的值. 题解:递推式为:$F[i]=F[i-1]+2*f[i-2]+i^4$ 主要问题是$i^4$处理,容易想到用矩阵 ...

  10. bzoj1009 GT考试 (kmp+矩阵优化dp)

    设f[i][j]是到第i位 已经匹配上了j位的状态数 然后通过枚举下一位放0~9,可以用kmp处理出一个转移的矩阵 然后就可以矩阵快速幂了 #include<bits/stdc++.h> ...