Docker Swarm:创建服务器集群

Docker Swarm:创建服务器集群


Docker Swarm 是创建服务器集群用的工具。把一堆服务器绑到一块儿用,让它们看起来像是一台服务器,通过统一的接口在这些服务器上运行应用。


集群里的服务器之间相互知道彼此,它们也知道哪些服务器上运行了什么样的服务,如果访问的服务在服务器上不存在,它会把访问转移到集群里的正确的服务器上去处理。一个服务可以用多个容器来支持,这些容器运行在集群里的不同的服务器上,请求可以均衡的分布给这些容器。当有服务器挂掉以后,在它上面运行的服务会被转移到其它的服务器上运行。


Docker Swarm 只需要几行命令就可以为应用创建一个强大的集群,为你的应用提供高可用的服务。


模拟集群环境


如果你已经有了几台服务器,安装 Docker 以后就可以去创建一个服务器集群了,如果你想在本地测试 Docker Swarm 的功能,可以模拟一个集群环境,也就是在本地创建几台 Linux 系统的虚拟机,安装 Docker ,配置集群。下面介绍使用 Vagrant 创建虚拟机的方法。
1.安装 Virtualbox:虚拟机软件 2.安装 Vagrant:管理虚拟机用的工具,它可以管理 Virtualbox 虚拟机 3.安装 Vagrant Hostmanager 插件
Windows 如果启用了 Hyper-v 以后,就不能再使用 Virtualbox 或者其它的虚拟软件了。
Vagrant Hostmanager 是 Vagrant 的一个插件,设置了虚拟机的主机名以后,这个插件可以帮助我们设置虚拟机中的 /etc/hosts 文件,在里面添加正确的主机记录,这样如果创建了多台虚拟机,这些虚拟机之间可以使用虚拟机的主机名来访问到对方,这个插件并不是必须的,不过它很有用,它也可以设置本地主机上的 hosts 文件,这样你在本地主机上也可以直接使用虚拟机的主机名来访问到它。


创建项目目录


cd /Users/devon/docker/
mkdir docker-swarm
cd docker-swarm

初始化项目,使用 centos/7 这个 box


vagrant init centos/7

用编辑器打开项目目录


atom ./

编辑一下项目根目录下的 Vagrantfile,替换成下面的代码,它可以创建三台虚拟机,test1,test2,test3。

Vagrant.configure(2) do |config|

  config.vm.box = "centos/7"

请安装 vagrant-hostmanager 插件


  # https://github.com/devopsgroup-io/vagrant-hostmanager
  config.hostmanager.enabled = true
  config.hostmanager.manage_host = true
  config.hostmanager.manage_guest = true

  config.vm.define "test1" do |test1|
    node1.vm.network "private_network", ip: "192.168.33.11"
    node1.vm.hostname="test1"
  end

  config.vm.define "test2" do |test2|
    node2.vm.network "private_network", ip: "192.168.33.12"
    node2.vm.hostname="test2"
  end

  config.vm.define "test3" do |test3|
    node3.vm.network "private_network", ip: "192.168.33.13"
    node3.vm.hostname="test3"
  end

end

启动虚拟机


vagrant up

安装 Docker


虚拟机启动以后,登录到这些虚拟机,然后在上面安装 Docker:

curl -fsSL https://test.docker.com/ | sh
sudo systemctl enable docker
sudo systemctl start docker

创建集群


集群里的服务器有两种身份,一个是 manager (管理员),一种是 worker(工人),在管理员服务器上可以创建服务,扩展服务,更新服务,管理员服务器本身也可以运行服务。先去初始化一个集群服务器,比如我想在 test1 这台服务器上初始化一下,先登录到这台服务器。

登录到 test1 服务器


vagrant ssh test1

初始化 Swarm 集群


docker swarm init --listen-addr test1:2377

这样 test1 默认就会是这个集群里的管理员,现在集群里只有一个节点服务器,可以查看一下:
docker node ls
在初始化集群的时候用了 --listen-addr,指定了一下这个集群管理员的地址还有端口号,默认地址应该是 0.0.0.0 ,这里我用了一个主机名来表示,test1。列出这个选项是让展示一下你可以自由的设置服务器的监听地址与端口号,如果使用主机名,你要保证集群里的其它的服务器可以使用这个主机名访问到这台服务器。
加入集群

有了集群以后,你要让其它的服务器加入进来:

登录到 test2


vagrant ssh test2

让 test2 加入到集群


docker swarm join --listen-addr test2:2377 test1:2377

登录到 test3


vagrant ssh test3

让 test3 加入到集群


docker swarm join --listen-addr test3:2377 test1:2377

现在集群里一共有三台服务器了,在集群的 manager 里面可以查看一下服务器的列表:

docker node ls

让服务器加入集群的时候,也用到了 --listen-addr 选项,设置了这台服务器监听的地址与端口,其它的服务器会使用这个地址与端口跟它进行交流。后面又指定了让这台服务器加入到的那个集群,也就是通知一下集群里的管理员服务器。


创建集群网络

集群里的服务器使用一种 overlay 类型的网络,我们可以创建一种这样的网络,然后在集群里运行服务的时候可以指定使用这个网络。在集群的
manager 上(test1),执行:

docker network create --driver overlay skynet

这样会创建一个名字是 skynet 的 overlay 类型的网络。


创建服务

在集群的 manger 节点上,可以去创建运行应用的服务,执行一下:

docker service create --name web --network skynet --publish 3000:3000 --replicas 1 devon/test

上面命令会基于宁皓网的 devon/node 镜像创建一个名字是 web 的服务,使用 skynet 这个名字的网络,发布的端口是 3000 。--replicas 指定了这个服务用一个容器来运行。完成以后,可以打开浏览器,访问一下:

http://test1:3000
http://test2:3000
http://test3:3000

虽然 web 这个服务只有一个容器运行,它会在集群里的某台服务器上,很可能是 test1 这个服务器,不管它在哪个服务器上运行,访问集群里的所有的服务器,都可以正常打开服务提供的页面,你应该会在页面上看到一个 hello ,还有运行这个应用的容器的 id 号。


扩展服务

现在我要用多个容器来运行应用,这些容器会在集群里的不同的服务器上运行。扩展运行服务的容器的数量,在集群的 manager 节点上执行一下:

docker service scale web=6

上面的命令会用 6 个容器同时运行 web 这个服务,这 6 个容器会分布在不同的服务器上,查看运行服务的任务,执行一下:

docker service tasks web

你会看到在哪些服务器上运行了 web 这个服务。在不同的浏览器上再访问一下应用的页面,你会发现,运行应用的容器的 id 号会有变化,也就是用户对应用的请求会被均衡的分布在不同的服务器上。


更新服务

服务被创建以后,可以更新它,比如服务的端口号,数据卷,网络,镜像,这些东西都可以更新。我要更新一下 web 服务用的镜像,在集群的 manager 上执行:

docker service update web --image devon/test:fanxiao2

它会让 web 服务基于新的镜像 devon/test:fanxiao2 去创建,更新完成以后,重新打开浏览器,访问一下应用的页面,页面上显示的内容会有变化。
如果发现下面的错误:

docker swarm init --listen-addr test1:2377 了 提示 docker: 'swarm' is not a docker command. See 'docker --help'.

这是版本问题导致的,请把docker 升级到 1.12及以上

本作品采用《CC 协议》,转载必须注明作者和本文链接
每一天都要进步一点点!
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

docker 大法好。用go做集群轻轻松松

6年前 评论
Fjun

@xuanjiang1985 的确Go语言的简单部署及开发,配上其高并发、 通信交互复杂、重业务逻辑的分布式等优势在当下开发很适用;目前360消息推送就在使用 Go的部署, 毫不夸张,1分钟内可以实现亿量级广播,日下发峰值百亿量级实在牛逼!
没事自己玩玩可以,当作学习一个新的知识,不过做好手头上该做的,把其做到最精才是首要任务 :grin:

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!