【转载】Docker与Kubernetes系列(七): Docker Swarm

原文地址

这段时间工作中用到了Docker以及Kubernetes(简称K8S),现在整理下我学习Docker以及K8S过程中看的一些比较好的资料,方便自己回顾,也希望能给容器小白一些帮助。给自己定一个小目标,二月底之前完成。

这是本系列的第七篇文章, 先不介绍K8S了, 我打算先来介绍Docker Swarm(K8S以后再说吧)。

本篇文章基本翻译和总结自Docker官方文档, 做了精简和改动。

一、Swarm的一些核心概念

docker engine中已经内嵌了集群管理和编排的特性,加入到集群中的docker engine就是以swarm模式运行的。 我们可以以初始化一个swarm或者加入一个swarm的方式来使docker engine进入swarm模式。

一个Swarm就是一个docker engine的集群,我们可以在上面部署services。 我们也可以同时在同一台Docker实例上部署service和单独的docker容器。

Node

一个节点就是一台加入到swarm中的docker实例。
要在swarm上部署应用,我们需要向集群的管理节点提交我们对service的定义, manager node会把一个个的task(下文会说到)分发到集群的工作节点上。默认情况下,manager node同时也是一个worker node。

Service和Task

service是对于要运行在worker node上的task的定义, 当我们创建一个service的时候,我们需要制定要run哪个image,以及在这个container里要run什么commands。
在replicated service模式下,manager node会根据我们scale的大小来决定在各个节点上运行多少个task。
一个task包含一个docker容器以及在这个容器中要运行的指令。 它是swarm调度的原子单位。
Swarm模式有一个内部的DNS组件,这个组件可以自动把Swarm内的每个service作为一个DNS入口,manager node使用内部的负载均衡器把请求分发给各个worker node。

二、在Swarm上部署一个service

我们需要做以下的事情:
  • 初始化一个以swarm模式运行的docker engine集群
  • 向这个集群中加入两个worker node
  • 部署一个service

初始化Swarm

首先我们通过SSH登录到用来做manager node的机器上, 如 ssh root@10.66.137.222
然后运行以下指令创建一个swarm:
docker swarm init --advertise-addr 10.66.137.222

加入Worker nodes

我们在manager node上运行以下指令:
docker swarm join-token worker,
会输出:
docker swarm join \
--token XXX \
10.66.137.222:2377
这就是我们要在worker node上要运行的指令, 运行之后, worker node 就加入到了这个swarm集群中。
加入之后,在manager node上运行 docker node ls, 会有类似以下输出:
[root@localhost ~]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
dsu1tginb4deet36qqzo4bbr3    localhost.localdomain  Ready   Active        Reachable
t2213ncsiy7oxfg73umm7fnyh    localhost.localdomain  Ready   Active
wbbl4h5qldptdaq6ogawvonhi *  localhost.localdomain  Ready   Active        Leader

部署service

比如 : docker service create --replicas 3 --name my-web -p 8080:80 nginx
我通过--replicas来定义task的数量,通过-p来使外部可以访问。之后我就可以通过http://10.66.137.222:8080/ 来访问到我的服务了: