在前面,我们可以把一个app运行为服务,并可以动态扩展。现在你可能需要把这个app配置到云端,运行在多个机器上。多个容器,多台机器的应用是通过swarm来实现的,也就是说把多台电脑加入一个docker族。
为了方便理解,我们看看docker学习的过程。首先我们实现了一个容器,容器可以直接运行成app;然后是把容器看成是服务,用yaml定义了这些服务,这样可以在一台机器上运行一个容器的多个实例,这样就构成了支持动态扩展的app;现在我们是要在多台机器上实现这个app,更方便扩展,并支持某台机器上的功能独立。也就是说,运行nginx的放在一台或多台机器上,需要用到数据库也放在一台或多台电脑上。
提醒一下,这里说的机器不一定是物理机器,大部分时候是云服务提供商给你提供的云端虚拟机。
swarm本意是蜂群,这里指一组运行着容器的机器,他们组成一个族。此时你运行之前的docker命令,app就能在族上运行,运行过程由swarm manager管理。swarm中的机器被称为节点。
swarm manager能使用多种策略来运行容器,例如:
空闲节点策略 -- 把容器运行在使用率最低的机器上
全局策略 -- 每个机器只能运行某种容器的一个实例。
你可以定义swarm manager使用哪种策略。swarm manager是swarm中的一台机器,它是唯一负责运行命令并授权其他机器进入swarm的机器。swarm中除了swarm manager外的机器都称为worker,因为他们只能提供计算资源,不能有任何其他特权。你在那台机器运行docker命令,哪台机器就是swarm manager,此后的任何命令都是在这台机器上执行。
docker swarm init命令就可以使能swarm模式,并且当前的机器就是swarm manager。然后在其他机器上运行docker swarm join使他们加入这个族,称为一个worker。具体步骤如下:
首先创建虚拟机
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
然后我们指定myvm1为swarm manager,也就是说要在myvm1上运行docker swarm init命令,这里说明一下,docker-machine ssh可以在host上给虚拟机发任何命令。如果不用,也可以登陆到虚拟机上自行运行docker swarm init的命令。
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"
Swarm initialized: current node <node ID> is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token <token> \
<myvm ip>:<port>
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
这里会提示你需要在worker上运行的join命令的格式及具体的token
$ docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:2377"
This node joined a swarm as a worker.
swarm创建好了之后,就是在swarm上配置app了,运行如下命令来获得配置命令
$ docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/sam/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)
docker-machine ls命令可以用来查看每台机器的状态。
最后运行与没有创建swarm时相同的命令,就可以把app运行起来。
docker stack deploy -c docker-compose.yml getstartedlab
查看当前的运行状态
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE
jq2g3qp8nzwx getstartedlab_web.1 gordon/get-started:part2 myvm1 Running
88wgshobzoxl getstartedlab_web.2 gordon/get-started:part2 myvm2 Running
vbb1qbkb0o2z getstartedlab_web.3 gordon/get-started:part2 myvm2 Running
ghii74p9budx getstartedlab_web.4 gordon/get-started:part2 myvm1 Running
0prmarhavs87 getstartedlab_web.5 gordon/get-started:part2 myvm2 Running
常用的docker-machine命令如下
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 <node ID>" # 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 myvm1eval $(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 <file> <app> # 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 <file> <app>" # 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
本文暂时没有评论,来添加一个吧(●'◡'●)