学习目标:

  •  Docker的网络管理
  •  Docker Swarm集群的使用
  •  Volumes数据卷的使用

1 Docker Swarm 概述

Docker Swarm集群的主要特点如下。

  1. 方便创建和管理集群
  2. 可扩展
  3. 可实现期望的状态调节
  4. 集群中多主机网络自动拓展管理
  5. 提供服务发现能力
  6. 可实现负载均衡
  7. 安全性强
  8. 支持延迟更新和服务回滚

2 Docker Swarm 使用

2.1 环境搭建

(1)准备3台Ubuntu系统主机(即用于搭建集群的 3 个 Docker 机器),每台机器上都需要安装 Docker 并且可以连接网络,同时要求 Docker 版本必须是 1.12 及以上,因为老版本不支持 Docker Swarm。
(2)集群管理节点 Docker 机器的 IP 地址必须固定,集群中的所有节点都能够访问该管理节点。
(3)集群节点之间必须使用相应的协议并保证其以下端口号可用:

  • 用于集群管理通信的 TCP 端口 2377;
  • TCP 和 UDP 端口7946,用于节点间的通信;
  • UDP 端口 4789,用于覆盖网络流量。

为了进行下面示例的演示,此处按照要求在虚拟机中分别安装了 3 台使用 Ubuntu16.04 系统的机器,这三台机器的主机名称分别为 manager1 (作为管理节点)、worker1 (作为工作节点)和 worker2 (作为工作节点),其 IP 地址分别如下。

manager1:	192.168.197.143
worker1:	192.168.10.144
worker2:	192.168.10.145

2.2 创建 Docker Swarm 集群

(1)在名为manager1的Docker机器上创建Docker Swarm集群,具体操作指令如下。

$ docker swarm init --advertise-addr 192.168.197.143

docker swarm mysql docker swarm mysql集群_Docker Swarm

然后在此节点查看集群节点信息。

docker swarm mysql docker swarm mysql集群_Docker_02

(2)在管理节点上,使用 docker node ls 指令查看集群节点信息。

docker swarm mysql docker swarm mysql集群_docker swarm mysql_03

2.3 向 Docker Swarm 集群添加工作节点

(1)启动另外两台 Docker 机器 worker1 和 worker2,分别打开终端窗口,向集群中加入工作节点的指令,具体操作指令如下。

$ docker swarm join --token SWMTKN-1-5brzty1cm6w9hmpej4viggq7ekclpdlq08r sfupzdi20u5wldg-2n0mw1wvli3qdjvzauxrida26 192.168.197.143:2377

Note:需要特别注意的是,上述指令的 --token 表示向指定集群中加入工作节点的认证信 息,一定要使用自己在前面创建 Docker Swarm 集群时返回的向集群中添加工作节点的指令。这一点在管理节点上执行 docker node join-token worker 指令进行查看。

docker swarm mysql docker swarm mysql集群_docker swarm mysql_04

(2)再次在集群管理节点上使用 docker node ls 指令查看集群节点信息。

docker swarm mysql docker swarm mysql集群_docker swarm mysql_05

2.4 向 Docker Swarm 集群部署服务

在向 Docker Swarm 集群中部署服务时,既可以使用 Docker Hub 上自带的镜像来启动服务,也可以使用自己通过 Dockerfile 构建的镜像来启动服务。若使用自己通过 Dockerfile 构建的镜像来启动服务,那么必须先将镜像推送到 Docker Hub 中心仓库。
这里使用 Docker Hub 上自带的 alpine 镜像为例来部署集群服务,具体操作指令如下。

$ docker service create --replicas 1 --name helloworld alpine ping docer.com

docker swarm mysql docker swarm mysql集群_docker_06

2.5 查看 Docker Swarm 集群中的服务

(1)当服务部署完成后,在管理节点查看当前集群中的服务列表信息。

$ docker service ls

docker swarm mysql docker swarm mysql集群_集群管理_07


(2)查看部署的服务的具体详情。

$ docker service inspect helloworld

(3)查看指定服务在集群上节点的分配和运行情况。

$ docker service ps helloworld

2.6 更改 Docker Swarm 集群服务副本数量

$ docker service scale helloworld=5

docker swarm mysql docker swarm mysql集群_docker_08

2.7 删除服务

对于不需要的服务,可以进行删除,操作指令如下。

$ docker service rm helloworld

在集群管理节点 manager1 上执行上述删除服务后,该服务就会在集群中彻底删除。

docker swarm mysql docker swarm mysql集群_docker swarm mysql_09

2.8 访问服务

前面部署的服务都没有直接向外界暴露服务端口,外界也无法正常访问服务。接下来我们就通过自定义 overlay 驱动网络为例来讲解集群下的网络管理与服务访问。
(1)在集群管理节点 manager1 上,查看网络列表。

$ docker network ls

docker swarm mysql docker swarm mysql集群_集群管理_10


(2)在集群管理节点 manager1 上,创建以 overlay 为驱动的自定义网络。

$ docker network create --driver overlay my-multi-host-network

docker swarm mysql docker swarm mysql集群_集群管理_11


(3)在集群管理节点 manager1 上,

$ docker service create --network my-multi-host-network --name my-web --publish 8080:80 --replicas 2 nginx

docker swarm mysql docker swarm mysql集群_docker_12


(4)在集群管理节点 manager1 上,查看服务的两个服务副本运行情况。

$ docker service ps my-web

docker swarm mysql docker swarm mysql集群_docker_13

(5)外界访问服务

打开浏览器,使用任意一台节点机器的 “IP + 8080” 端口进行服务访问,都可以正常显示。

docker swarm mysql docker swarm mysql集群_docker swarm mysql_14