摘要:
使用Docker Toolbox 以及脚本,能很快速方便地创建好Docker Swarm集群环境。Docker自从1.12版开始,引擎内置Swarm mode集群功能,有许多新的特性,这些新特性,老的 Docker Swarm都不具备,但现在来学习也是有必要的。Docker Swarm集群到底怎么使用呢?集群上的操作与单机上的操作有什么不同呢?本文通过对比实验,加深对集群操作的理解。
现有疑问:
使用Docker Toolbox 以及编好的脚本,能很快速、很方便地在本地电脑上创建好一个Docker Swarm集群环境。但这样的Docker Swarm集群却无法使用docker swarm/ docker node/docker Service等命令(会报404 page not found错误),Docker Swarm集群到底怎么操作呢?如何使用Docker Swarm集群呢?Docker Swarm集群上的操作与单机Docker上的操作有什么不同呢?
自从Docker 1.12版开始,Docker引擎内置的Swarm mode集群功能,有许多新的特性,比如去中心化的容错设计、内置负载均衡、跨主机网络路由等。这些新特性,老的Docker Swarm都不具备,现在还来学习以前使用的Docker Swarm集群还有必要吗?
特别说明:
1、不能混淆Docker Swarm和Swarm mode,具体参见我整理的另一篇《Docker Swarm和Swarm mode是两个概念!!》。
2、我觉得再来学习老式的Docker Swarm集群是有必要的,集群搭建的思想都差不多,都要求性能更强大、资源利用率更高、功能更多更全、更加安全可靠、更加易于使用等,很多知识都是触类旁通的,在学习中增长见识,见证Swarm发展的历史。
3、集群是使用Consul作为KV存储服务器的,从中可以学到如何以容器的方式创建及使用Consul。这种使用方式在很多地方都用得到。
本文目录:
1、创建老式的Docker Swarm集群
1.1创建1个K/V外部键值存储虚机
1.2创建3个master集群管理虚机
1.3创建1个node集群工作虚机
2、实际操作对比及说明(单机上操作与Docker Swarm集群上操作的对比)
2.1 docker-machine 切换主机的命令不同,--swarm参数,单机不用,集群要用
2.2 docker info不同,一个是单机的信息,一个显示整个集群的信息
2.3 docker ps 不同,一个是显示单机运行的容器,一个显示整个集群运行的容器
2.4 docker pull不同,一个是在单机上下载镜像,一个是整个集群机器都下载一遍
2.5 docker volume不同,一个是在单机上创建数据卷,一个在整个集群上创建数据卷
2.6 docker network不同,一个是在单机上创建网络,一个是在集群中的每台机器上都创建的网络,实现跨主机的通讯。
2.7 docker run不同,一个是在单机上运行容器,一个是在集群中按照调度策略,选择其中一台机器,运行容器。多次执行同一条命令(仅端口和容器名称不一样),可以看到容器被分配到不同主机上运行的效果
2.8 docker images不同,单机上显示当前机器上的镜像,如果切换到集群,则显示所有节点内的镜像。(这点还是有疑问的,单机上下载的镜像,在集群环境下也显示该镜像?)
集群创建:
集群由1个K/V虚拟机、3个master集群管理虚拟机、1个node集群非管理虚拟机组成。使用docker-machine create 命令快速创建虚机,主要创建过程如下:
# 1.1创建1个K/V外部键值存储虚机
# 为了以后快速下载Docker镜像,解决国内网络访问国外服务器慢的问题,
# 在创建虚拟机时,一定要加上镜像加速器地址。
# kv虚拟机的名称为kvstore
docker-machine create \
--driver virtualbox \
--engine-registry-mirror=https://registry.docker-cn.com \
kvstore
# 切换到kvstore虚拟机上
# 运行consul容器,提供集群的KV存储和查询服务
eval $(docker-machine env kvstore)
docker run --name consul \
--restart=always \
-p 8400:8400 \
-p 8500:8500 \
-p 53:53/udp \
-d progrium/consul \
-server -bootstrap-expect 1 \
-ui-dir /ui
# 显示Consul图形化管理界面的的访问方法:
echo 访问 consul服务器的网址:http://$(docker-machine ip kvstore):8500/ui
# 1.2.1 创建3个master集群管理虚机
# 创建Swarm集群的主控节点 master1
# 使用KV存储,提供服务发现功能
# 注意末尾的反斜杠后面不能有空格!!!
docker-machine create \
--driver virtualbox \
--engine-registry-mirror=https://registry.docker-cn.com \
--swarm \
--swarm-master \
--swarm-discovery="consul://$(docker-machine ip kvstore):8500" \
--engine-opt="cluster-store=consul://$(docker-machine ip kvstore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
master1
# 1.2.2创建Swarm集群的管理节点 master2
docker-machine create \
--driver virtualbox \
--engine-registry-mirror=https://registry.docker-cn.com \
--swarm \
--swarm-master \
--swarm-discovery="consul://$(docker-machine ip kvstore):8500" \
--engine-opt="cluster-store=consul://$(docker-machine ip kvstore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
master2
# 1.2.3创建Swarm集群的管理节点 master3
docker-machine create \
--driver virtualbox \
--engine-registry-mirror=https://registry.docker-cn.com \
--swarm \
--swarm-master \
--swarm-discovery="consul://$(docker-machine ip kvstore):8500" \
--engine-opt="cluster-store=consul://$(docker-machine ip kvstore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
master3
# 1.3 创建1个node集群工作节点虚机
# 注意:这里没有 --swarm-master 参数
docker-machine create \
--driver virtualbox \
--engine-registry-mirror=https://registry.docker-cn.com \
--swarm \
--swarm-discovery="consul://$(docker-machine ip kvstore):8500" \
--engine-opt="cluster-store=consul://$(docker-machine ip kvstore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
node1
实际操作及说明:
我们可以同时打开两个Docker Toolbox控制终端,执行不同的操作命令,从中对比分析,发现其中的不同之处,加深对Docker Swarm操作的理解和认识。
# 2.1 docker-machine 切换主机的命令不同,单机不用--swarm参数,集群要用
# 执行Docker-machine ls时,可以区分开集群操作和单机操作
# 加上--swarm参数,切换到集群操作状态,执行ls时有(swarm)标记
# 不加--swarm参数,执行ls则没有(swarm)标记,便于区分、识别。
#
# 2.2 docker info不同,一个是单机的信息,一个显示整个集群的信息
# 下左窗是单机的情况下,docker info显示单机的Docker信息,
# 其中的swarm:inactive指的是 swarm mode的状态为inactive
# 并不是指该机器不是Docker Swarm的成员。
# 下右窗是集群的操作,使用--swarm参数,切换到集群内的控制节点master1
# 执行docker info时显示整个Docker Swarm集群的Docker信息,
# 图上显示集群共有4个节点,共有17个容器,13个在运行,8个镜像
# 以及4个节点服务器上的地址端口、状态、运行的容器、CPU内存大小等相关信息。
#
# 2.3 docker ps不同,一个是显示单机运行的容器,一个显示整个集群运行的容器
# 下图左窗中,分别显示每台单机上的容器运行情况,
# 下图右窗中,使用 --swarm 参数,切换到任何一个管理节点,
# 都可以查看整个集群运行的容器,
# 并且非管理节点无法使用 --swarm 参数(如node1节点)。
#
# 2.4 docker pull不同,一个是在单机上下载镜像,一个是集群上每台机器上都下载
# 下图左窗口中,在单机上拉取busybox镜像,该镜像只在单机上有
# 下图右窗口中,在集群控制节点中拉取busybox镜像,
# 结果显示分别在3个控制节点和1个工作节点上都下载了该镜像。
# 分别切换到几个节点上,查看镜像,确实都已经下载到本地了,
# 同样在集群中删除镜像时,会一并把所有节点上的busybox镜像都删除了
#
# 2.5 docker volume不同,一个是在单机上创建数据卷,一个在整个集群上创建数据卷
# 同样的道理,在单机上创建数据卷,只在该单机上,
# 而在集群控制节点上创建数据卷,一条创建命令,分别在4个节点上都创建了www数据卷
#
# 2.6 docker network不同,一个是在单机上创建网络,一个是在集群中创建网络。
# 与数据卷创建不同的是,创建覆盖网络可以在每个节点上进行,无需--swarm参数,
# 在任意集群节点上创建覆盖网络,则集群中每台机器中都有该网络,从而实现跨主机的通讯。#这一点,集群的操作和集群内一台单机上操作是没有区别的。
# 删除网络时,在集群中任何一个节点上删除覆盖网络,其他机器上就没有该网络了,
# 集群内也没有该网络了
#
# 2.7 docker run不同,一个是在单机上运行容器,
# 一个是在集群中按照调度策略,
# 选择其中一台机器,运行容器。
# 在集群中多次执行同一条命令(仅端口和名称不一样),
# 可以看到容器被分配到不同的主机上去执行
#
# 2.8 docker images不同,在单个节点上下载镜像,该节点上是肯定有的,
# 切换到其他节点上查看,并没有该镜像,
# 再但切换到集群上查看,集群中却有该镜像?!
#(这点是有疑问的,单机上下载的镜像,在集群环境下也显示该镜像?)
#
# 结束