上一讲说明了如何安装 docker,以及在 docker 下如何获取及启动容器。下面说说如何使用 docker 创建集群。docker 作为一种全新的容器技术相比传统的虚拟机来说最大的优势就在于轻量化。本来我们使用虚拟机最主要的目的还是想使用虚拟机来启动一些隔离的应用程序。但为了启动这些应用程序不得不创建庞大的虚拟机。所以为什么我们不直接启动被隔离的程序而不需要启动虚拟机哪?这样岂不省去了很多硬盘及内存存储空间。
不仅如此,在当今 BS+MS 模式风靡全球的情况下,大家需要向别人提供在线服务,而一旦并发访问量增大的时候,我们的服务器往往难以承载。所以仅靠单台服务器来对外提供服务是很难满足应用需求的。这时候就需要多台机器并行提供服务,但无论后台有多少台机器运行对于用户来说都是不可知的,只需要按照统一的地址进行访问。这就是集群。集群技术被应用到互联网或政务云环境已经有很多年了。以往虚拟机的模式基本是通过 "负载均衡器 + 逻辑主机" 的模式运行的,也就是外部多个请求来了之后由负载均衡器进行分发,将请求分发给某个逻辑主机进行处理,并将处理结果返回给客户端。负载均衡器有硬件和软件两种。硬件的种类有很多,而且价格往往都不菲。软件负载均衡器有 apache、nginx 等好几种,大都免费,基本可以满足日常需求。但无论哪种方式,动态扩容都不是很容易,不是得停机就是得写复杂的模块挂载到 apache 或 nginx 上。
当 docker 容器出现后一切都变得那么简单,不仅配置变得简单,动态扩容或收缩都变得很容易。
如果想使用 docker 创建容器集群,较低版本的 docker 是不太好弄的,操作较为复杂,建议将 docker 升级到最新版 (1.13 版以上)。这里以 1.13.1 为例向大家介绍如何使用 swarm 搭建 docker 集群。
第一步:首先在宿主机的终端中执行如下命令:
- $ sudo docker run --rm swarm create
此时生成的 token 6cce80f59f4292ba8f4e085950c6f480 一定得保存好,后面要用它来创建集群环境。
接下来,我们使用如下命令在宿主机上启动多个容器:
- $docker run -i -t -d tomcat:latest /bin/bash
如上图所示,我们运行了两次命令,因此便创建了两个容器实例。命令中加上参数 "-d" 是为了让容器以守护模式运行,这样不至于在终端输入 "exit" 断开容器后容器自动关闭掉。
接下来查看一下每个容器的 IP 地址,在宿主机中输入如下命令以便查看所有运行的容器实例:
- $sudo docker ps
从上图中可以看到有两个 tomcat 的容器实例在运行,接下来运行如下命令进入第一个容器:
- $docker exec -it e7bc718f8429 /bin/bash
这时就进入到了 ID 为 e7bc718f8429 的容器内,再在容器内运行 ip addr 命令即可查看容器的 IP 地址:
可以看到,容器的 IP 地址为 172.17.0.3,类似的,可以看到另一个容器的 IP 地址为 172.17.0.2(说明:如果没有做额外的配置,同时启动容器时又没有指定 IP 地址,那么容器的 IP 地址一般从 172.17.0.1 或 172.17.0.2 开始的,如果宿主机的 IP 地址为 127.17.0.1,则容器的 IP 地址就从 172.17.0.2 开始分配,否则就从 172.17.0.1 开始分配)。
第二步:在宿主机中运行如下命令将两个容器加入到集群中 (如果像上图一样还在容器中,则在终端中输入 exit 命令即可返回宿主机):
- $sudo docker run –-rm swarm join –addr=172.17.0.2:2375
出现上图中的提示信息就表示添加成功了,但是必须按下 Ctrl+C 组合键才可退出。类似地,我们可以将另外一个 IP 地址 172.17.0.3 也添加到 swarm 集群中。
第三步:在宿主机的终端中运行如下命令启动 swarm manager:
- $sudo docker run–d–p 2376 : 2375 swarm manage token: //6cce80f59f4292ba8f4e085950c6f480
像上图一样执行完命令后出现了一个新的 ID 就表示启动成功了,到此 swarm 集群搭建完毕。可以运行如下命令查看集群中包含的节点:
- $docker run– - rm swarm list token: //6cce80f59f4292ba8f4e085950c6f480
可以看到,目前集群中有两个节点:172.17.0.3 和 172.17.0.2。下面我们来验证一下集群的效果。我们分别进入每个容器启动一下 tomcat:
这时用宿主机的对外 IP 地址访问 tomcat:
可以看到,已经可以通过集群访问 tomcat 了。
为了验证集群的效果,我们可以再次进入容器将其中的 tomcat 顺次关闭。首先进入 172.17.0.2 中关闭 tomcat:
- root@647d583c2f14:/usr/local/tomcat/bin#sh shutdown.sh
此时再在浏览器中刷新页面,会发现依然可以访问 tomcat 首页:
而再进入 172.17.0.3 中关闭 tomcat:
- root@e7bc718f8429:/usr/local/tomcat/bin#sh shutdown.sh
此时再在浏览器里刷新页面,会出现如下问题:
此时已经无法通过集群访问页面了!然后再进入 172.17.0.3 启动 tomcat:
再刷新页面:
OK,swarm 集群搞定!
回过头来我们再来分析一下。网上很多教程里对于 swarm join 命令里的 IP 地址说的不是很清楚,到底是哪个机器的 IP?宿主机的还是容器的?经笔者测试后发现,swarm join 只能写由本机启动的容器的 IP 地址,否则虽然能够添加成功,但集群机制却不起作用。
希望对大家学习 docker 集群有所帮助!
来源: http://www.bubuko.com/infodetail-1964058.html