---
title: "【转载】Docker与Kubernetes系列(七): Docker Swarm"
id: "1534"
type: "post"
slug: "%e3%80%90%e8%bd%ac%e8%bd%bd%e3%80%91docker%e4%b8%8ekubernetes%e7%b3%bb%e5%88%97%e4%b8%83-docker-swarm"
published_at: "2017-08-09T21:21:06+00:00"
modified_at: "2017-08-09T21:21:06+00:00"
url: "https://seq.ink/all/1534.html"
markdown_url: "https://seq.ink/all/1534.html.md"
excerpt: "原文地址 这段时间工作中用到了Docker以及Kubernetes（简称K8S），现在整理下我学习Docker以及K8S过程中看的一些比较好的资料，方便自己回顾，也希望能给容器小白一些帮助。给自己定一个小目标，二月底之前完成。 这是本系列的 ..."
taxonomy_category:
  - "ALL"
---

**[原文地址](http://blog.csdn.net/u012422829/article/details/57129491)**

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

这是本系列的第七篇文章， 先不介绍K8S了， 我打算先来介绍[Docker](http://lib.csdn.net/base/docker)
 Swarm（K8S以后再说吧）。

本篇文章基本翻译和总结自[Docker官方文档](https://docs.docker.com/engine/swarm/)
， 做了精简和改动。

# 一、Swarm的一些核心概念

[docker](http://lib.csdn.net/base/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/ 来访问到我的服务了：
