一、前言

随着互联网快速发展,以及微服务架构的流行,服务器的压力越来越大。上一篇介绍的 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. 深入理解JVM(一)——基本原理

    前言 JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点. 运行流程 我们都 ...

  2. Javascript高级编程学习笔记(58)—— 事件(2)事件处理程序

    事件处理程序 事件处理程序即响应某个事件的函数 事件处理程序以 “on” 开头 如“onclick”,“onload” HTML事件处理程序 某个元素支持的每种事件都可以使用一个与响应的事件处理程序同 ...

  3. linux下postgres的安装

    软件包的下载 在浏览器中访问https://www.enterprisedb.com/download-postgresql-binaries 然后选择适合自己的版本,我选择的是linux64位下的1 ...

  4. JDK设计模式之—单例模式和static关键字

    首先了解static 关键字 static声明的方法是静态方法,static声明的成员变量为静态成员变量.对于该类的所有对象来说,static的成员变量和static只有一份存储空间 即使没有创建该类 ...

  5. Kali学习笔记15:防火墙识别、负载均衡识别、WAF识别

    防火墙简单的识别方式: 如图: 可以简单明了看出:发送SYN不回应,发送ACK回RST可以说明开启过滤等等 基于这个原理,我们可以写一个脚本来对防火墙来探测和识别: #!/usr/bin/python ...

  6. Vue 加载外部js文件

    Vue.js  加载外部js文件 在项目内新建一个config.js //变量的定义 export var config = { baseurl:'http://172.16.114.5:8088/M ...

  7. win 10 升级远程连接服务器 要求的函数不受支持

    首先展示错误信息: win10更新系统后,之前连接的服务器都连接不上了,应该用一下方法解决: 运行 gpedit.msc,打开本地组策略:计算机配置>管理模板>系统>凭据分配> ...

  8. IntelliJ IDEA 与 SVN配置

    问题背景 如果开发工具使用的是IntelliJ IDEA,版本管理工具使用的是SVN. 就涉及到SVN集成的问题,但是可能会遇到选择在IDEA中配置SVN的时候,在SVN的安装bin目录找不到文件 s ...

  9. Java单元测试(Junit+Mock+代码覆盖率)

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  10. 一个用于分页的page类

    今天周一,趁工作轻松,自己就写了一个基于MySQl数据库的分页查询,做分页,最主要的是以下几点: 一:写sql语句:比如查询某张数据表的数据,sql语句为:select * from table li ...