一、前言

随着互联网快速发展,以及微服务架构的流行,服务器的压力越来越大。上一篇介绍的 Docker Compose 项目,可以将多个容器捏合在一起,实现容器间的通信,比如 Web 项目对 DB、Cache 的依赖,以及微服务之间的通信等。但这还是远远不够的,Docker Compose 仅仅局限在一个 Docker 主机上,服务器的压力仍然没有得到解决,怎么办呢?集群呗!Docker Swarm 可以将多个 Docker 主机 集群成一个大型的虚拟 Docker 主机,然后在上面部署服务,当服务器压力上来时,不断的往 Swarm 集群中添加 Docker 主机就行了!更重要的,不必像传统发布那样,在每台服务器上都运行一遍分布式项目,大大节约了流程和工作量。

由于没有多台 Docker 主机给我做集群操作,以及 Centos 7 上 安装虚拟机各种报错,以下多为学习笔记。

二、基本概念

Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具,提供 Docker 容器集群服务。

Swarm 集群中每台 Docker 主机称为一个节点。其中主动初始化一个 Swarm 集群的节点称为管理节点,加入一个Swarm 集群的节点称为工作节点。工作节点是任务执行节点,管理节点将任务下发至工作节点执行。管理节点默认也作为工作节点。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader。

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

服务(Services):是指一组任务的集合,服务定义了任务的属性,主要有两种模式(通过 docker service create 的 --mode 参数指定):

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

三、创建 Swarm 集群

1、创建管理节点

docker swarm init

这样就初始化了一个 Swarm 集群,执行该命令的节点自动成为管理节点,命令的结果会给出提示表示如何加入该节点,如下。

2、创建工作节点

docker swarm join \
--token SWMTKN--49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:

表示该 Docker 主机作为工作节点,加入到 Swarm 集群中。

3、查看集群

#管理节点使用
docker node ls

四、部署升级服务

1、部署服务

现在我们将多个 Docker 主机虚拟成一个大型的虚拟主机了,我们使用 docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。

docker service create --replicas  -p : --name nginx nginx:1.13.-alpine
--replicas 为该镜像创建三个副本集,管理节点会将副本实例均匀部署在集群中的 Docker 主机上
--name 服务名

使用 docker service ls 来查看当前 Swarm 集群中运行的服务。

使用 docker service ps [服务名] 来查看某个服务的详情。

使用 docker service logs [服务名] 来查看某个服务的日志。

使用 docker service scale 对一个服务运行的容器数量进行伸缩,根据业务的压力自由伸缩容器的数量:

docker service scale nginx=[num]

使用 docker service rm 来从 Swarm 集群中移除某个服务。

2、升级服务

docker service update --image nginx:1.13.-alpine nginx
--image nginx:1.13.-alpine 镜像名
nginx 需要升级的服务名

3、回退服务

如果新部署的服务出现问题,我们需要快速的将服务回退到前一个版本!

docker service rollback [服务名]

五、管理敏感数据和配置信息

1、使用 secret 管理敏感数据

在动态的、大规模的分布式集群上,管理和分发密码、证书 等敏感信息是极其重要的工作。我们可以用 docker secret 命令来管理敏感信息,并允许在多个Docker 容器实例之间共享访问制定的敏感数据。

secret创建后其内容是不能更新的,只能删除掉旧的secret然后再重新创建,并且不能删除正在被使用的secret。

printf 'mysqlPassword' | docker secret create mysql_password -

使用 docker secret ls 命令来查看 secret 。

创建 MySQL 服务:

docker service create \
--name mysql \
--replicas \
--network mysql_private \
--mount type=volume,source=mydata,destination=/var/lib/mysql \
--secret source=mysql_root_password,target=mysql_root_password \
--secret source=mysql_password,target=mysql_password \
-e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \
-e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" \
-e MYSQL_USER="wordpress" \
-e MYSQL_DATABASE="wordpress" \
mysql:latest

如果没有在 target 中显式的指定路径时,secret 默认通过 tmpfs 文件系统挂载到容器的 /run/secrets 目录中。

secret 也可以在 Docker Compose 中使用。

2、使用 config 管理配置信息

Docker 新增了 docker config 子命令来管理集群中的配置信息,用户无需将配置文件放入镜像或挂载到容器中就可实现对服务的配置。

创建 config

docker config create redis.conf redis.conf

使用 docker config ls 命令来查看 config

利用配置文件创建服务:

#如果没有在 target 中显式的指定路径时,默认的 redis.conf 以 tmpfs 文件系统挂载到容器的 /config.conf
docker service create \
--name redis \
# --config source=redis.conf,target=/etc/redis.conf \
--config redis.conf \
-p 6379:6380 \
redis:latest \
redis-server /redis.conf

config 仅能在 Swarm 集群中使用。

参考资料:https://yeasy.gitbooks.io/docker_practice/swarm/

Docker 系列六(Docker Swarm 项目).的更多相关文章

  1. Docker系列六: 使用Docker官方公共仓库和私有仓库

    使用公共仓库 登陆官方网站:https://hub.docker.com/   注册账号和密码 在Docker hub中创建一个资源,  create  respositories,   创建后会提示 ...

  2. Docker系列03—Docker 基础入门

    本文收录在容器技术学习系列文章总目录 1.概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳.储存.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. ...

  3. Docker系列05—Docker 存储卷详解

    本文收录在容器技术学习系列文章总目录 1.存储卷介绍 1.1 背景 (1)docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加面成,启动容器时,docker会加载只读镜像层并在镜 ...

  4. Docker系列之Docker镜像(读书笔记)

    一.基本概念 Docker包括三个基本概念镜像.容器.仓库. Docker镜像:就是一个只读的模板.例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Apache或其他应用程序.用 ...

  5. Docker系列01—Docker 基础入门

    一.初识Docker和容器 1.1 什么是docker 容纳其他物品的工具,可以部分或完全封闭,被用于容纳.存储.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. 容器? 容器就是在隔离的环 ...

  6. docker 系列之 docker安装

    Docker支持以下的CentOS版本 CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS 仅发行版本中的内核支持 Docker. ...

  7. Docker系列二: docker常用命令总结

    https://docs.docker.com/reference/  官方命令总结地址 容器生命周期管理 1.docker run 创建一个新的容器并运行一个命令 docker run [optio ...

  8. Docker系列一: docker简介及基本环境安装

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...

  9. Docker系列03—Docker 存储卷

    一.存储卷介绍 1.1 背景 Docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部加一个读写层: 如果运行的容器修改了 ...

随机推荐

  1. python yield 关键字

    最近看代码看到python里面的yield关键字,和我之前接触的语言好像都没有来着,我就查了查它的含义,大概理解如下: >>> def createGenerator(): ... ...

  2. 背水一战 Windows 10 (111) - 通知(Tile): secondary tile 模板之图片, secondary tile 模板之分组

    [源码下载] 背水一战 Windows 10 (111) - 通知(Tile): secondary tile 模板之图片, secondary tile 模板之分组 作者:webabcd 介绍背水一 ...

  3. Akka-CQRS(5)- CQRS Writer Actor 部署和测试

    上篇我们做了一个WriterActor的例子,主要目的是示范WriterActor如何作为集群分片用persistentActor特性及event-sourcing模式实现CQRS的写功能.既然是集群 ...

  4. 基于kNN的手写字体识别——《机器学习实战》笔记

    看完一节<机器学习实战>,算是踏入ML的大门了吧!这里就详细讲一下一个demo:使用kNN算法实现手写字体的简单识别 kNN 先简单介绍一下kNN,就是所谓的K-近邻算法: [作用原理]: ...

  5. Oracle to_char(参数,'FM990.00')函数

    遇到一个SQL,记录一下 select to_char(参数,'FM990.00') from 表格 刚看到FM990.00确实不知道什么意思,通过网上资料,知道了 0表示:如果参数(double或者 ...

  6. Python并发目录

    Python并发目录 Python-socket网络编程 Python网络编程-IO阻塞与非阻塞及多路复用 Python进程-理论 Python进程-实现 Python进程间通信 Python进程池 ...

  7. ubuntu16.04 在线安装docker ce

    官方文档:https://docs.docker.com/install/linux/docker-ce/ubuntu/   ubuntu创建普通用户: adduser dk001 给该用户添加sud ...

  8. vue 解决无法设置滚动位置的问题

    问题描述 在实现锚点定位的时候发现无法设置滚动条的位置. 在Vue中,使用 document.body.scrollTop=952 无法设置滚动条的高度. document.body.scrollTo ...

  9. 课程回顾-Neural Network & Deep Learning

    为什么深度学习发展了数据计算算法发展Logistics RegressionNumpyreshape的计算代价很小,所以你不确定数据维度的时候都可以放上一些解决潜在bug的trick做了归一化之后梯度 ...

  10. Jexus使用的相关记录

    前言 本文是零零散散的记录,部分内容是我在平时工作中用到的,部分是从群里"偷"来的,所以难免会有一些错误. 主要还是希望能帮到部分使用Jexus的朋友. 安装 curl https ...