概述:在群(cluster)中部署应用,将应用运行在多台机器上。将不同机器加入Docker化的群(cluster)——使多容器,多机器应用成为可能,又叫做群(swarm)。
swarm是运行Docker并且加入cluster中的一组机器,启动swarm后,你同样可以运行熟悉的Docker命令,但是他们现在是通过swarm管理员运行在cluster上面。swarm上的机器可以是虚拟的也可以是物理的,加入swarm以后,他们都称为“节点”。
swarm管理员可以通过多种策略运行容器,如:(可以通过Compose文件命令swarm管理员运行制定策略。)
swarm中的身份:
直到现在都只使用单主机模式(single-host mode)在本地机器上运行Docker,但是Docker也可以转换成swarm模式(swarm mode),使用swarm模式,本机会成为swarm管理员——现在,Docker将命令运行在你管理的swarm上,不仅仅是现在的机器。
这里仅提供virtualbox的使用方法。
首先,创建虚拟机:
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
查看虚拟机信息:
docker-machine ls
可以通过docker-machine ssh向虚拟机发送信息,通过docker swarm init指定一个虚拟机为swarm管理员
docker-machine ssh myvm1 "docker swarm init --advertise-addr "
同时,输出会包含一个docker swarm join命令,可以将其他机器作为工作机节点加入swarm
docker-machine ssh myvm2 "docker swarm join \
--token \
:2377"
查看swarm中的节点:
docker-machine ssh myvm1 "docker node ls"
可以通过docker swarm leave命令离开swarm。
(三)在集群(swarm cluster)上部署应用
现在,可以通过上一节的过程重新部署应用,不过注意:只有swarm管理员(在这里是myvm1)可以执行docker命令,工作机只是提供能力(capacity)。
1)将docker-machine shell配置为swarm管理员(的shell)
直到现在,我们都只是通过将docker命令包裹在docker-machine ssh中来与虚拟机对话。另一种方式是通过docker-machine env
docker-machine env myvm1
使用,如上命令,然后复制并运行命令输出的最后一行。
2)在swarm管理员上部署应用
我们可以通过前一节的命令部署应用:
docker stack deploy -c docker-compose.yml getstartedlab
注意:我们现在已经连接上了myvm1虚拟机,并且可以同时访问本地文件(docker-compose.yml)。现在,应用已经部署在集群上(swarm cluster)上了。现在我们可以通过docker service ps
docker stack ps getstartedlab
我们可以通过以下命令查看服务状态,注意:服务都被分布在不同的机器上了
docker stack ps getstartedlab
3)访问你的cluster
现在,你可以通过myvm1、myvm2的任意一个IP地址访问你的应用(IP地址可以通过docker-machine ls查看)。每一次都可能访问到不同的容器Id——证明了负载均衡的使用。
所有IP地址都可以使用是因为:swarm中的所有节点都加入了一个路口路由网格(ingress routing mess),这保证了部署在swarm中一个特定端口的服务都有自己保留的端口,不论实际运行容器的是哪一个节点。下面是一个名为my-web、部署在8080端口、存在于一个三节点swarm的服务的网状路由示意图。
注意:为了在swarm中使用入口网络,在使用swarm模式前,请保证一下端口开放:
同样是使用前一节的方法:
修改完之后,别忘了使用docker stack deploy重新部署。
1)销毁栈(stack):
docker stack rm getstartedlab
2)swarm:
docker-machine ssh myvm2 "docker swarm leave"
docker-machine ssh myvm1 "docker swarm leave --force"
3)消除docker-machine shell变量设置:
(试了貌似没用)
4)重启docker-machine:如果关闭了本地主机,docker机器会自动关闭,可以通过以下命令重启:
docker-machine start
docker-machine create --driver virtualbox myvm1 # Create a VM (Mac, Win7, Linux)
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10
docker-machine env myvm1 # View basic information about your node
docker-machine ssh myvm1 "docker node ls" # List the nodes in your swarm
docker-machine ssh myvm1 "docker node inspect " # Inspect a node
docker-machine ssh myvm1 "docker swarm join-token -q worker" # View join token
docker-machine ssh myvm1 # Open an SSH session with the VM; type "exit" to end
docker node ls # View nodes in swarm (while logged on to manager)
docker-machine ssh myvm2 "docker swarm leave" # Make the worker leave the swarm
docker-machine ssh myvm1 "docker swarm leave -f" # Make master leave, kill swarm
docker-machine ls # list VMs, asterisk shows which VM this shell is talking to
docker-machine start myvm1 # Start a VM that is currently not running
docker-machine env myvm1 # show environment variables and command for myvm1
eval $(docker-machine env myvm1) # Mac command to connect shell to myvm1
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression # Windows command to connect shell to myvm1
docker stack deploy -c # Deploy an app; command shell must be set to talk to manager (myvm1), uses local Compose file
docker-machine scp docker-compose.yml myvm1:~ # Copy file to node's home dir (only required if you use ssh to connect to manager and deploy the app)
docker-machine ssh myvm1 "docker stack deploy -c " # Deploy an app using ssh (you must have first copied the Compose file to myvm1)
eval $(docker-machine env -u) # Disconnect shell from VMs, use native docker
docker-machine stop $(docker-machine ls -q) # Stop all running VMs
docker-machine rm $(docker-machine ls -q) # Delete all VMs and their disk images