一、准备工作
- 安装Docker
- 理解并安装Docker Compose
- 理解并安装docker machine
- 保证看过入门(一)、(二)、(三)部分,并且对其文中例子都有实操
- 注册docker仓库
二、介绍
在这一部分,你将学会如何将应用部署到集群里,并且运行在多个宿主机上。Swarm可以帮助我们实现在多容器多机器上部署服务。
Swarm是一个运行着Docker集群,我们可以通过Docker命令来控制这个集群,不过你只能通过swarm manager来下令命令。集群中的机器可以是物理机也可以是虚拟机,当它们加入至swarm之后,这些机器都是一个节点。
Swarm Manager会使用几种策略来运行容器,诸如:
- “empliest node(最空节点)” :选择使用率最低的节点来运行容器
- "Global(全局“):确定每个节点至少有一个容器在运行
你可以在compose文件里指定这些策略。
Swarm Manager仅对那些加入swarm的机器执行你的指令,还可以授权其他节点成为swarm的工作节点。工作节点是指那些只提供资源无授权能力的节点。
三、配置你的Swarm
Swarm可以由多个节点组成,这些节点可以是物理机也可以是虚拟机。运行如下指令开启swdoarm节点:docker swarm init 并把运行该命令的机器作为warm的管理节点,然后在其他宿主机或虚拟机上运行 docker swarm join 加入到这个swarm集群中并成为工作节点。
-
创建集群
- 至少有两个虚拟机(如果没有,可以用VisualBox构建两台虚拟机)
我们可以在阿里云或其他云平台上构建虚拟机,然后用Machine进行远程管理Docker,官方提供的[generic driver]https://docs.docker.com/machine/drivers/generic/?spm=a2c4e.11153940.blogcont7495.9.609623609q2Uui),可通过ssh管理现有的机器,原则上所有的Linux机器都支持。
下面我们以阿里云的ECS为例说明如何用Machine管理Docker。
2.docker-machine的ssh只支持基于public key认证,而阿里云创建虚拟机时只支持通过密码登录,所以还需要配置Public Key。
- 至少有两个虚拟机(如果没有,可以用VisualBox构建两台虚拟机)
export ECS_IP=x.x.x.x #阿里ECS的IP地址
docker-machine create --driver generic --generic-ip-address=x.x.x.x
aliyun-machine-1
docker-machine create --driver generic --generic-ip-address=x.x.x.x
aliyun-machine-2
3、列出被管理的docker主机的个数
docker-machine ls
例如:
4、初始化swarm并且增加节点
# aliyun-machine-1作为管理节点(先执行docker swarm init命令的那台虚拟机将是管理机,其他则是工作机)
#登录aliyun-machine-1,并初始化swarm
$ docker-machine ssh aliyun-machine-1 "docker swarm init"
#如果提示失败需要增加-advertise-addr
#初始化成功以后,会返回一个提示信息,告诉你怎么加入这个集群
#增加一个工作节点 docker swarm join -token :
$ docker-machine ssh aliyun-machine-2 "docker swarm join --token :"
使用docker-machine ssh aliyun-machine-1
登录aliyun-machine-1主机上,使用docker node ls
可以查看当前swarm集群中所有的节点
&docker-machine ssh aliyun-machine-1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
xxx1 aliyun-machine-2 Ready Active
xxx2 * aliyun-machine-1 Ready Active Leader
在Swarm Manager中部署应用
最难的部分已完成,现在开始同第(三)节一样部署应用。首先将之前准备好的docker-compose.yml复制一份到aliyun-machine-1部署应用,可以用如下命令
docker-machine scp docker-compose.yml aliyun-machine-1:~
我们要开始使用swarm来部署啦!同样还是docker stack deploy
:
docker-machine ssh aliyun-machine-1"docker stack deploy -c docker-compose.yml helloApp"
结束了。
- 让我们再来看看容器吧
$ docker stack ps helloApp
ID NAME IMAGE NODE DESIRED STATE
xxx1 helloApp_web.1 john/get-started:part2 aliyun-machine-1 Running
xxx2 helloApp_web.2 john/get-started:part2 aliyun-machine-2 Running
xxx3 helloApp_web.3 john/get-started:part2 aliyun-machine-2 Running
xxx4 helloApp_web.4 john/get-started:part2 aliyun-machine-1 Running
xxx5 helloApp_web.5 john/get-started:part2 aliyun-machine-2 Running
访问集群
我们可以通过 aliyun-machine-1和 aliyun-machine-2的IP地址来访问应用,他们之间的网络是共享的,容器间是负载均衡的。你可以使用docker-machine ls
查看ip。我们从浏览器打开应用时,控制台的状态不断的在刷新,因为是负载均衡的。
伸缩应用
和第(三)篇一样,你只需要修改docker-compose.yml
,然后再执行docker stack deploy
即可,swarm会自动调整配置。同样我们可以再建几个虚拟机加入到该集群中,只要重新运行docker stack deploy
warm会把新的节点利用起来。
关闭应用
关闭应用docker-machine ssh aliyun-machine-1 "docker stack rm helloApp"
让节点脱离swarm集群:docker-machine ssh aliyun-machine-2 "docker swarm leave"
关闭管理节点:docker-machine ssh aliyun-machine-1 "docker swarm leave --force"
参考
https://docs.docker.com/get-started/part4/
https://blog.dubby.cn/detail.html?id=8738