文章目录
一、学习前提
参考学习前提,重要的是安装docker machine,参考官网。
二、说明
在docker之服务 中,我们将应用转换为一个可提供服务的产品。而本部分我们将此应用程序部署到群上,在多台计算机上运行它(一个叫做群的"dockerized"簇使该操作成为可能)
三、理解集群
参考 官网
群(swarm)是一个运行了docker并加入到簇(cluster)的设备集合。在集群之后,我们任然可以像以前那样执行docker命令,只不过现在命令的执行交个群管理器(swarm manager)来执行。刚才我们提到的设备可以是实际存在的物理机也可以是虚拟机,此时每个设备我们称为节点(node)。
群管理器(swarm manager)使用了一些策略来运行我们的容器。
在我们的群(swarm)中,只有群管理器(swarm manager)可以执行我们的docker命令和授权其它设备作为工作设备(worker)。而工作设备(worker)只提供空间(capacity),而不能权限去指挥其它设备能敢什么和不能干什么。
之前我们是在单主机模式(single-host mode)下使用docker的。然而docker也支持群模式( swarm mode)。从让你的机器成为群管理器(swarm manager)时,docker执行命令时,是不仅仅在当前设备上,而是在整个群(swarm)上。
四、设置集群
- 使用以下命令,让你的docker从单主机模式(single-host mode)切换到
群模式( swarm mode),并让你的设备成为群管理器(swarm manager):
docker swarm init
- 使用下面命令来指定其它设备作为 群 的工作设备(worker)。
docker swarm join
4.1 创建 簇
注意:为了创建 簇 ,我们需要虚拟机或物理机,这里我们使用虚拟机。因此我们需要可以创建虚拟机(VM)的虚拟机管理程序,参考 官网
- 创建两个虚拟机(不要用这种方式创):
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
注意:官网是这样创建的,然而后面访问 簇 失败了,于是寻找了很久的解决办法 链接,用这种方法创建myvm1、myvm2
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" --hyperv-boot2docker-url >"https://github.com/boot2docker/boot2docker/releases/download/v18.06.1-ce/boot2docker.iso" myvm1
- 列出你的虚拟机并给他们分配ip
root@fengli-cp:/home/fengli/Desktop# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Running tcp://192.168.99.100:2376 v18.09.0
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v18.09.0
- 初始化 群 并添加节点,可以使用命令 docker-machine ssh 向虚拟机发出命令。如:
docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100"
以上命令是用来指定myvm1成为一个群管理器。而下面命令是为了向虚拟机发出命令,并让其成为一个工作设备:
docker-machine ssh myvm2 " docker swarm join --token SWMTKN-1-2uyacwisnpbkwa0sixz9oyvhs5z65v409j1mizgc4x5utddg4m-8npl2mr9u3jki050s8gm0hzpx 192.168.99.100:2377"
- 在群管理器上使用以下命令来显示群上面的节点。
docker-machine ssh myvm1 "docker node ls"
结果:
czxydhsmy122kekewo7zt22sb * myvm1 Ready Active Leader 18.09.0
bw5bfheoh5vnfnyicwy887gyt myvm2 Ready Active 18.09.0
此时,我们就创建了一个群了。
五、在集群上部署应用程序
现在我们就可以用在docker之服务 的命令来将我们的应用部署到 集群上面了。
5.1 为 群管理器 配置一个脚本
之前我们都是使用docker-machine ssh
来和虚拟机进行通讯的。现在,我们使用另外一种方法 docker-machine env <machine>
,这个方法的好处是允许你使用本地的docker-compose.yml来部署远程的应用。
对于不同操作系统,有不同的不在,具体参考 官网,我这里使用的是linux平台。
- 使用命令
docker-machine env myvm1
获取配置于myvm1通讯的shell 命令。 - 运行获取到的命令
eval $(docker-machine env myvm1)
来配置于myvm1通讯的shell。 - 使用命令
docker-machine ls
来验证当前myvm1已经激活(如星号所示)。
5.2 部署应用程序到 群管理器 上
- 现在,使用以下命令部署应用到myvm1上,注意你所在的当前目录要有docker-compose.yml:
docker stack deploy -c docker-compose.yml getstartedlab
- 下面命令列出我们服务的任务,之一现在我们的服务被分布到myvm1和myvm2上了
docker stack ps getstartedlab
5.3 访问我们的 群
访问任意一个ip都行。
- 可以同在浏览器上访问(我的ip为什么和上面不一样,是因为我在ubuntu上也做过,在window也做过,这里方法的是win10版本的)
- 通过
curl http://172.29.214.49
六、迭代扩展应用程序
通过更改docker-compose.yml文件来扩展应用程序。
通过编辑代码更改应用程序行为,然后重建并推送新 镜像。
七、清理和重启
- 清理堆
docker stack rm getstartedlab
- 重启机器
docker-machine start <machine-name>