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
参数这里有两个作用:- 指定我们创建虚拟机需要的
boot2docker.iso
文件所在目录以及一些证书文件位置,这些证书文件用来作为创建成功后的linux系统的登陆凭据 - 指定我们创建成功后的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支持的网络模型才是最基础最重要的部分。