docker集群演练

docker集群演练

​ 本文我将创建一个docker集群,通过docker集群的创建以及应用的部署来简单的介绍一下docker工具链的使用,我会尽量多的介绍docker工具及命令参数。

集群环境介绍:

​ 我们将部署一个只有3台机器的集群环境,由于没有太多的硬件设备,所以这里我将使用2台虚拟机+1台物理机构建集群环境,其中2台虚拟机我使用hyper-v创建(因为我的开发环境是win10,hyper-v更方便些),另一台我用ubuntu。

  • node1的IP地址:194.168.1.51

  • node2的IP地址:194.168.1.52

  • node3的IP地址:194.168.1.90 (ubuntu)

使用docker-maching创建两台hyper-v虚拟机

创建node1节点

我们先来创建node1节点,执行如下命令:

docker-machine --storage-path v:/docker create node1 --driver hyperv --hyperv-cpu-count  1 --hyperv-memory 2048 --hyperv-static-macaddress 000000000051 --hyperv-virtual-switch wifi

命令解释:

  • --storage-path参数这里有两个作用:

    1. 指定我们创建虚拟机需要的boot2docker.iso文件所在目录以及一些证书文件位置,这些证书文件用来作为创建成功后的linux系统的登陆凭据
    2. 指定我们创建成功后的linux系统的存储位置

    boot2docker.iso文件是专为docker而生的linux系统发布镜像,它体积很小只有50M左右,系统内仅包含了docker工具

  • create用来指定我们需要创建的虚拟机名称(node1),已经虚拟机的一些配置信息

  • --driver用来指定我们将要创建的虚拟机是基于hyper-v的,查看更多支持的虚拟机驱动

  • --hyperv-cpu-count指定创建的hyper-v虚拟机cpu核心数

  • --hyperv-memory指定创建的hyper-v虚拟机内存

  • --hyperv-static-macaddress指定创建的虚拟机的静态mac地址,我这里设置一个自定义静态地址是为了在路由器上设置mac与ip的绑定,以确保虚拟机每次都会获取相同的ip地址

  • --hyperv-virtual-switch指定创建的虚拟机使用的虚拟网卡名称,这一步需要你先在hyper-v中配置一个虚拟网卡,至于网卡以什么方式联网由你确定,我这里使用的桥接到我的物理网卡

    更多虚拟机的配置命令请查看对应的虚拟机驱动参数

创建node2节点

将上一步命令中的node1改为node2,将000000000051改为000000000052,修改后的命令如下:

docker-machine --storage-path v:/docker create node2 --driver hyperv --hyperv-cpu-count  1 --hyperv-memory 2048 --hyperv-static-macaddress 000000000052 --hyperv-virtual-switch wifi

查看我们创建的虚拟机信息

查看我们使用docker-machine创建的虚拟机列表:

docker-machine --storage-path v:/docker ls

查看某一台虚拟机的信息:

docker-machine --storage-path v:/docker env node1
docker-machine --storage-path v:/docker config node1
docker-machine --storage-path v:/docker ip node1
# .... 更多命令查看docker-machine --help

删除我们创建的虚拟机

如果你觉得之前创建的虚拟机不符合要求可以删除它重新创建:

docker-machine --storage-path v:/docker rm node1

因为我们之前修改了虚拟机的默认存储位置,所以每次执行命令都要带上--storage-path参数

创建node3节点

docker-machine支持将现有的机器导入docker-machine中:

  • 需要你的机器配置ssh秘钥登录,ssh秘钥登录配置教程
  • 确保node1,node2,node3在同一子网,并可以相互访问

如果node3机器上的docker没有暴露在局域网中

这种情况下docker-machine会在node3上安装docker并将docker暴露在局域网中,还会修改node3的主机名:

# 这里要求将命令行执行路径重定向到node3_rsa文件的目录
# node3_rsa是node3的登陆私钥
docker-machine --storage-path v:/docker create node3 --driver generic --generic-ip-address 194.168.1.90 --generic-ssh-user root --generic-ssh-key node3_rsa

如果node3上没有安装docker,那么这一步执行时间会比较长,主要是要联网下载docker。如果安装了docker,则会检查docker是否暴露在局域网中,如果没有则会配置docker暴露在局域网中。

如果node3机器上的docker已经暴露在局域中(这种方式存在的意义不大)

这种个情况下我们可以直接导入node3到docker-machine中,但是这种方式导入的主机无法通过docker-machine管理

docker-machine --storage-path v:/docker create node3 --driver none --url=tcp://194.168.1.90:2376

使用docker swarm配置集群

配置node1作为manager节点:

# 使用docker-machine执行命令,其实相当于先ssh到node1,再执行docker swarm init,这一点也体现了docker-machine的方便之处,我们只需要指定节点名称就行,不需要关心节点地址
docker-machine --storage-path v:/docker ssh node1 'docker swarm init'

# 执行以上命令后会看到如下提示,将该命令分别在node2,node3的机器上执行就可以创建两个worker节点:
docker swarm join --token SWMTKN-1-13n2frpoil0zf1nza58feijwgnv368rbhmupw7875ohwg31gk1-5p0g89lu8oqbfy5wf4ijicqt2 194.168.1.51:2377

# 如果要部署多个manager节点,执行如下命令查看如何加入多个manager:
docker-machine --storage-path v:/docker ssh node1 'docker swarm join-token manager'

配置node2作为worker节点:

docker-machine --storage-path v:/docker ssh node2 'docker swarm join --token SWMTKN-1-13n2frpoil0zf1nza58feijwgnv368rbhmupw7875ohwg31gk1-5p0g89lu8oqbfy5wf4ijicqt2 194.168.1.51:2377'

配置node3作为worker节点:

docker-machine --storage-path v:/docker ssh node3 'docker swarm join --token SWMTKN-1-13n2frpoil0zf1nza58feijwgnv368rbhmupw7875ohwg31gk1-5p0g89lu8oqbfy5wf4ijicqt2 194.168.1.51:2377'

到此我们就创建了有一个manager和两个worker的集群。

使用docker service部署应用

docker-machine --storage-path v:/docker ssh node1 'docker service create -p 80:80 --replicas 1 --name nginx_test daocloud.io/library/nginx'

执行上面命令我们就创建了一个nginx_test服务,该服务启动一个nginx应用,在浏览器中访问任意node的80端口都可以访问到这个nginx应用,这就是docker服务的魅力。

  • -p参数发布一个端口映射到nginx应用的端口,这里服务的端口是80,nginx的端口为80,如果你在运行nginx容器的node中通过docker ps -a命令查看运行的容器这里并不会显示nginx容器的80端口绑定在了node的哪一个端口上,但是通过任意node的80端口你依然可以访问nginx,这是因为docker集群帮我们做了映射,docker集群网络是一个复杂的话题,有机会后面再研究。
  • --replicas改参数指定需要运行nginx容器的实例个数,我们可以运行任意多个容器实例,当你访问任意node的80端口时,docker集群都会帮你路由到不同的容器上。
  • --name指定docker服务的名称,你可以设置为任意字符串。

总结

​ 本篇文章的开始我们讲解了如何使用docker-machine创建一些docker节点,并演示了如何创建docker集群并在docker集群上部署了一个服务。

​ 这篇只能作为docker的入门文章,我们简要介绍了docker中的一些工具的简单使用,这对于整个docker来说只能算是冰山一角 ,后续我会继续研究docker,主要是对网络这一块做研究,掌握docker支持的网络模型才是最基础最重要的部分。

posted @ 2018-10-22 19:12  Net_win  阅读(827)  评论(2编辑  收藏  举报