程序员开发实例大全宝库

网站首页 > 编程文章 正文

虚拟技术基础四:docker中的蜂群swarm

zazugpt 2024-08-27 23:56:40 编程文章 21 ℃ 0 评论

在前面,我们可以把一个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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表