了解Swarm集群

群集是一组运行Docker并加入群集的计算机。在此之后,继续运行使用的Docker命令,但现在它们由群集管理器在群集上执行。群中的机器可以是物理的或虚拟的。加入群组后,它们被称为节点。

Swarm管理器可以使用多种策略来运行容器,例如“最节点的节点” - 它使用容器填充利用率最低的机器。或“全局”,它确保每台机器只获得指定容器的一个实例。指示swarm管理器在Compose文件中使用这些策略,就像您已经使用的那样。

群集管理器是群中唯一可以执行命令的机器,或授权其他机器作为工作者加入群集。工人只是在那里提供能力,并且没有权力告诉任何其他机器它能做什么和不能做什么。

到目前为止,您一直在本地计算机上以单主机模式使用Docker。但是Docker也可以切换到swarm模式,这就是使用群集的能力。立即启用群集模式使当前计算机成为群集管理器。从那时起,Docker就会运行您在管理的swarm上执行的命令,而不仅仅是在当前机器上。

添加 :

创建群

在此过程结束时,所有三个Docker主机将连接到群集,并将使用名为的覆盖网络连接在一起ingress

  1. master。初始化群。如果主机只有一个网络接口,则该--advertise-addr标志是可选的。

    $ docker swarm init --advertise-addr=<IP-ADDRESS-OF-MANAGER>  //网卡地址

    记下打印的文本,因为它包含您将用于加入worker-1和使用worker-2swarm 的标记。将令牌存储在密码管理器中是个好主意。

  2. worker-1,加入群。如果主机只有一个网络接口,则该--advertise-addr标志是可选的。

    $ docker swarm --join --token <TOKEN> \
    --advertise-addr <IP-ADDRESS-OF-WORKER-1> \ //节点1网卡地址
    <IP-ADDRESS-OF-MANAGER>:2377 //master网卡地址
  3. worker-2,加入群。如果主机只有一个网络接口,则该--advertise-addr标志是可选的。

    $ docker swarm --join --token <TOKEN> \
    --advertise-addr <IP-ADDRESS-OF-WORKER-2> \ //节点2网卡地址
    <IP-ADDRESS-OF-MANAGER>:2377
  4. manager,列出所有的节点。此命令只能从经理完成。

    $ docker node ls
    
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
    d68ace5iraw6whp7llvgjpu48 * ip-172-31-34-146 Ready Active Leader
    nvp5rwavvb8lhdggo8fcf7plg ip-172-31-35-151 Ready Active
    ouvx2l7qfcxisoyms8mtkgahw ip-172-31-36-89 Ready Active

    您还可以使用该--filter标志按角色进行过滤:

    $ docker node ls --filter role=manager
    
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
    d68ace5iraw6whp7llvgjpu48 * ip-172-31-34-146 Ready Active Leader $ docker node ls --filter role=worker ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
    nvp5rwavvb8lhdggo8fcf7plg ip-172-31-35-151 Ready Active
    ouvx2l7qfcxisoyms8mtkgahw ip-172-31-36-89 Ready Active
  5. node1和node2列出Docker网络manager,并注意到它们现在都有一个名为的覆盖网络和一个名为的网桥。此处仅显示列表:worker-1worker-2ingressdocker_gwbridgemanager

    $ docker network ls
    
    NETWORK ID          NAME                DRIVER              SCOPE
    495c570066be bridge bridge local
    961c6cae9945 docker_gwbridge bridge local
    ff35ceda3643 host host local
    trtnl4tqnc3n ingress overlay swarm
    c8357deec9cb none null local

设置群

群由多个节点组成,可以是物理或虚拟机。基本概念很简单:

docker swarm init  以启用swarm模式并使当前计算机成为群集管理器

docker swarm join  在其他计算机上运行 以使它们作为工作者加入群组

1 .使用VM快速创建一个双机群集并将其转换为群集

您需要一个可以创建虚拟机(VM)的虚拟机管理程序,因此计算机操作系统安装Oracle VirtualBox

现在,docker-machine使用VirtualBox驱动程序创建几个VM :

docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2



列出虚拟机并获取其IP地址

docker-machine ls

NAME   ACTIVE  DRIVER   STATE     URL          SWARM   DOCKER   ERRORS
default    -       virtualbox    Running   tcp://192.168.99.100:2376        v18.05.0-ce
myvm1    -      virtualbox   Running    tcp://192.168.99.101:2376        v18.05.0-ce
myvm2    -      virtualbox   Running    tcp://192.168.99.102:2376       v18.05.0-ce

补充:

docker-machine rm myvm1 --force  //强制删除节点

2. 初始化SWARM并添加节点

第一台机器充当管理器,执行管理命令并验证工作人员加入群,第二台是工作人员。

可以使用命令向VM发送命令docker-machine ssh。指示myvm1 成为一个swarm管理器docker swarm init并查找如下输出:

PS C:\Program Files\Docker Toolbox> docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.103"

docker swarm join --token SWMTKN-1-1571g8tuo3h2cy8jz5h0ya1hc5okd1nlr9b8ksi61ctul1ykxz-4nlejv9ttye9lklx89a8b6clu 192.168.99.103:2377

myvm2 将新群组作为工作者加入:

PS C:\Program Files\Docker Toolbox> docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-1571g8tuo3h2cy8jz5h0ya1hc5okd1nlr9b8ksi61ctul1ykxz-4nlejv9ttye9lklx89a8b6clu 192.168.99.103:2377"

补充:

PS C:\Program Files\Docker Toolbox> docker swarm leave --force //强制推出群

注意:

端口2377和2376

始终运行docker swarm initdocker swarm join使用端口2377(群集管理端口),或根本没有端口,并使其采用默认值。

docker-machine ls包含端口2376 返回的计算机IP地址,即Docker守护程序端口。请勿使用此端口,否则 可能会遇到错误

使用SSH时遇到问题?试试--native-ssh标志

Docker Machine 可以使用自己系统的SSH,如果由于某种原因在向Swarm管理器发送命令时遇到问题。只需--native-ssh在调用ssh命令时指定 标志:

docker-machine --native-ssh ssh myvm1 ...

docker node ls在管理器上运行以查看此群中的节点:

PS C:\Program Files\Docker Toolbox> docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
brtu9urxwfd5j0zrmkubhpkbd myvm2 Ready Active
rihwohkh3ph38fhillhhb84sk * myvm1 Ready Active Leader

如果要重新开始,可以docker swarm leave 从每个节点运行

3.在群集群集上部署应用程序

docker-machine为swarm管理器配置shell

windos10的SHELL环境:

PS C:\Program Files\Docker Toolbox> docker-machine env myvm1
$Env:DOCKER_TLS_VERIFY = "1"
$Env:DOCKER_HOST = "tcp://192.168.99.101:2376"
$Env:DOCKER_CERT_PATH = "C:\Users\Administrator\.docker\machine\machines\myvm1"
$Env:DOCKER_MACHINE_NAME = "myvm1"
$Env:COMPOSE_CONVERT_WINDOWS_PATHS = "true"
# Run this command to configure your shell:
# & "C:\Program Files\Docker Toolbox\docker-machine.exe" env myvm1 | Invoke-Expression

运行给定命令以配置要与之通信的shell myvm1:
PS C:\Program Files\Docker Toolbox> docker-machine.exe  env myvm1 | Invoke-Expression

MAC或LINUX上的DOCKER机器SHELL环境

运行docker-machine env myvm1以获取命令以配置要与之通信的shell myvm1

$ docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export
DOCKER_CERT_PATH="/Users/sam/.docker/machine/machines/myvm1"
export
DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your
shell:
#
eval $(docker-machine env myvm1)

运行给定命令以配置要与之通信的shell myvm1

eval $(docker-machine env myvm1)

运行docker-machine ls以验证它myvm1现在是活动计算机,如旁边的星号所示。

$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 * virtualbox Running tcp://192.168.99.100:2376 v17.06.2-ce
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.06.2-ce

4. 在群集管理器上部署应用程序

运行以下命令以部署应用程序myvm1

docker stack deploy -c docker-compose.yml getstartedlab

注意:如果的映像存储在私有注册表而不是Docker Hub上,则需要使用登录docker login <your-registry>,然后需要将--with-registry-auth标志添加到上述命令中。例如:

docker login registry.example.com

docker stack deploy --with-registry-auth -c docker-compose.yml getstartedlab

这会使用加密的WAL日志将登录令牌从本地客户端传递到部署服务的swarm节点。有了这些信息,节点就可以登录注册表并提取图像。

$ docker stack ps getstartedlab

ID            NAME                  IMAGE                   NODE   DESIRED STATE
jq2g3qp8nzwx getstartedlab_web.1 gordon/get-started:part2 myvm1 Running
88wgshobzoxl getstartedlab_web.2 gordon/get-started:part2 myvm2 Running
vbb1qbkb0o2z getstartedlab_web.3 gordon/get-started:part2 myvm2 Running
ghii74p9budx getstartedlab_web.4 gordon/get-started:part2 myvm1 Running
0prmarhavs87 getstartedlab_web.5 gordon/get-started:part2 myvm2 Running

访问群集

你可以从IP地址来访问你的应用程序要么 myvm1myvm2

您创建的网络在它们之间共享并进行负载平衡。运行 docker-machine ls以获取VM的IP地址,并在浏览器上访问其中任何一个,点击刷新(或只是curl它们)。

有五种可能的容器ID都是随机循环的,这表明了负载平衡。

两个IP地址工作的原因是群中的节点参与入口路由网格。这可确保部署在swarm中某个端口的服务始终将该端口保留给自身,无论实际运行容器的是哪个节点。下面是一个图表,说明在三节点群上的my-web端口8080上发布的服务的路由网格如何显示:

请记住,要在群集中使用入口网络,需要在启用群集模式之前在群集节点之间打开以下端口:

  • 端口7946 TCP / UDP用于容器网络发现。
  • 端口4789 UDP用于容器入口网络。

迭代和扩展您的应用程序

通过更改docker-compose.yml文件来扩展应用程序。

通过编辑代码更改应用程序行为,然后重建并推送新图像。

在任何一种情况下,只需docker stack deploy再次运行即可部署这些更改。

可以使用docker swarm join您使用的相同命令将任何机器(物理或虚拟)加入此群myvm2,并将容量添加到群集中。只需在docker stack deploy之后运行,应用就可以利用新资源。

清理并重新启动

堆栈和群

你可以拆掉堆栈docker stack rm。例如:

docker stack rm getstartedlab

取消设置docker-machine shell变量设置

您可以docker-machine使用给定命令在当前shell中取消设置环境变量。

Linux上,命令是:

  eval $(docker-machine env -u)

在Windows上,命令是:

  PS C:\Program Files\Docker Toolbox> docker-machine.exe env -u | Invoke-Expression

重启Docker机器

如果关闭本地主机,Docker计算机将停止运行。

$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Stopped Unknown
myvm2 - virtualbox Stopped Unknown

要重新启动已停止的计算机,请运行:

docker-machine start <machine-name>
 

docker练习-群的更多相关文章

  1. [经验交流] Apache Mesos Docker集群初探

    前言 因工作需要,我对基于Apache Mesos 的 Docker 集群作了一点研究,并搭建了一套环境,以下是资料分享. 1. Apache Mesos概述 Apache Mesos是一款开源群集管 ...

  2. Docker系列之(二):使用Mesos管理Docker集群(Mesos + Marathon + Chronos + Docker)

    1. Mesos简介 1.1 Mesos Apache Mesos 是一个分布式系统的管理软件,对集群的资源进行分配和管理. Mesos主要由以下几部分组成: Master: 管理各Slave节点 S ...

  3. 使用Docker构建持续集成与自动部署的Docker集群

    为什么使用Docker " 从我个人使用的角度讲的话  部署来的更方便 只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 虚拟化让集群的管理和控制部署都更方便 hub.docke ...

  4. Docker集群实验环境布署--swarm【1 架构说明】

    在读完<Docker技术入门与实践>这本书后,基本上已对Docker了有一些入门的理解,以及我们为什么要使用Docker 答:我们发现在实际工作中,通过openstack一旦把一个VM创建 ...

  5. Docker 集群环境实现方式

    Docker 集群环境实现的新方式 近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展 ...

  6. Docker 集群环境实现的新方式

    近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展,加之企业业务需求的不断变化,紧随技 ...

  7. Docker 集群

    1.  理解swarm swarm(译:集群) 一个swarm是一组运行着Docker的机器,它们一起加入到一个集群.swarm中的机器既可以是物理机,也可以是虚拟机.在加入到一个swarm后,每台机 ...

  8. Docker Swarm搭建多服务器下Docker集群

    对于有多台服务器来讲,如果每一台都去手动操控,那将会是一件非常浪费时间的事情,毕竟时间这东西,于我们而言,十分宝贵,或许在开始搭建环境的时候耗费点时间,感觉是正常的,我也如此,花费大堆时间在采坑和填坑 ...

  9. 05 Docker集群/基础设施 - DevOps之路

    05 Docker集群/基础设施 - DevOps之路 文章Github地址,欢迎start:https://github.com/li-keli/DevOps-WiKi Docker的集群目前主流的 ...

  10. k8s docker集群搭建

    一.Kubernetes系列之介绍篇   •Kubernetes介绍 1.背景介绍 云计算飞速发展 - IaaS - PaaS - SaaS Docker技术突飞猛进 - 一次构建,到处运行 - 容器 ...

随机推荐

  1. angular select框 option空行

    1.使用option <select class="form-control" ng-model="searchType"> <option ...

  2. [C#] ServiceStack.Redis如何批量的pop数据?

    要安全的批量pop数据,有两个办法: 1.用事务(不用事务的话可能导致重复读.ServiceStack的pipeline是没有自带事务的.) 2.执行lua脚本 我这里提供用事务的实现方法: publ ...

  3. linux 如何编译安装软件

  4. UVA 11996 Jewel Magic —— splay、序列的分裂与合并、LCP的哈希算法

    #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> ...

  5. Gyn 100989 "1D Cafeteria (B)"(set+lower_bound)

    传送门 •题意 某自助餐厅有 n 张桌子,桌子编号为 1~n,其中第 i 张桌子可容纳 ai 个人: 有两种操作: (1)in x : 有 x 个人来这家餐厅吃饭,需要找一个可容纳 x 人的桌子,并满 ...

  6. el-tree文本内容过多显示不完全问题(解决)

    布局: <span class="custom-tree-node" slot-scope="{ node, data }"> 外层span 树节点 ...

  7. Spring Security 5中 PasswordEncoder的使用

    在最新的 Spring Security 5发布版本中, 出于安全性的考虑调整了PasswordEncoder的实现与使用策略. 1.以前常用的实现 StandardPasswordEncoder, ...

  8. The Function() Constructor

    Functions are usually defined using the function keyword, either in the form of a function definitio ...

  9. P1031 栈的序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  10. P1025 最大完美度

    题目描述 定义一个字符串的完美度为字符串中所有字符的完美度的和. 现在给你一个只含字母的字符串s, 每一个字母的完美度由你进行分配, 可以分配给一个字母[1,26]中的一个数字作为完美度, 但每个字母 ...