Docker 学习笔记(四):群(swarm)

    概述:在群(cluster)中部署应用,将应用运行在多台机器上。将不同机器加入Docker化的群(cluster)——使多容器,多机器应用成为可能,又叫做群(swarm)。

(一)什么是集群(swarm cluster)?

    swarm是运行Docker并且加入cluster中的一组机器,启动swarm后,你同样可以运行熟悉的Docker命令,但是他们现在是通过swarm管理员运行在cluster上面。swarm上的机器可以是虚拟的也可以是物理的,加入swarm以后,他们都称为“节点”。    

    swarm管理员可以通过多种策略运行容器,如:(可以通过Compose文件命令swarm管理员运行制定策略。)

  • “最少节点”策略——使用最少的机器;
  • “全局”——保证每台机器获得容器的一个实例

    swarm中的身份:

  • swarm管理员是唯一一台在swarm中可以执行命令、许可其他机器加入swarm(以“工作机”的身份)。
  • 工作机只是提供能力(capacity),并没有权利去告诉其他机器可以做什么、不可以做什么。

    直到现在都只使用单主机模式(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 <myvm1 ip>"

    同时,输出会包含一个docker swarm join命令,可以将其他机器作为工作机节点加入swarm

docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>: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 <machine>,让当前shell直接与虚拟机的docker守护进程对话。更重要的一点是,这种方式允许你直接使用本地的docker-compose.yml文件去部署远程的app,而不必将它到处复制。

docker-machine env myvm1

    使用,如上命令,然后复制并运行命令输出的最后一行。

    2)在swarm管理员上部署应用

    我们可以通过前一节的命令部署应用:

docker stack deploy -c docker-compose.yml getstartedlab

    注意:我们现在已经连接上了myvm1虚拟机,并且可以同时访问本地文件(docker-compose.yml)。现在,应用已经部署在集群上(swarm cluster)上了。现在我们可以通过docker service ps <service_name>命令去确认所以应用已经被重新部署了。

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模式前,请保证一下端口开放:

  • Port 7946 TCP/UDP for container network discovery.
  • Port 4789 UDP for the container ingress network.

(四)迭代 & 扩展应用

    同样是使用前一节的方法:

  • 扩展应用:编辑docker-compose.yml文件;
  • 修改应用行为:编辑代码、重新构建、上传镜像;
  • 加入其它机器:无论是虚拟的还是物理的机器,都可以通过同样的docker swarm join实现;

    修改完之后,别忘了使用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 <machine-name>

(六)备忘单:

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 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 <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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值