Docker学习笔记(五)——Get Started, Part 4:集群

本文详细介绍了如何使用Docker Machine、Docker Compose和Docker Swarm搭建集群,包括创建虚拟机、初始化Swarm、添加节点、部署应用及管理集群等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Prerequisites

  • 安装Docker 1.1.3以上版本
  • 安装Docker Compose
  • 安装Docker Machine
$ base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  mkdir -p "$HOME/bin" &&
  curl -L $base/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe" &&
  chmod +x "$HOME/bin/docker-machine.exe"
  • 确保已经发布friendlyhello镜像到注册系统
  • 运行image,可以通过这个命令:docker run -p 80:80 username/repo:tag, 然后访问 http://localhost/

介绍

在第3部分中,您使用了您在第2部分中编写的应用程序,并通过将其转换为服务来定义它应如何在生产中运行,在此过程中将其扩展5倍。

在第4部分中,您将此应用程序部署到集群上,在多台计算机上运行它。通过连接多台机器到一个docker化的集群(swarm),使得多容器,多机应用程序成为可能。

理解 Swarm 集群

swarm 是一组机器,这些机器上运行Docker,并被加入到一个集群中。在swarm中,docker 命令不变,通过swarm manager 在集群上执行。swarm中的机器可以是物理的也可以是虚拟的,加入swarm后,他们被称作节点(node)

Swarm管理员可以使用多种策略来运行容器,例如“最空节点” - 它可以使用容器填充使用率最低的机器。或者“全局”,它确保每台机器只获取指定容器的一个实例。您指示swarm管理员在Compose文件中使用这些策略,就像之前那样使用。

swarm管理员是swarm集群中唯一可以执行你的命令的机器,可以授权其他机器作以worker身份加入swarm。workers只提供容量,并没有权力告诉任何其他机器可以做什么和不可以做什么。

到目前为止,您已经在本地机器上以单主机模式使用Docker。但是Docker也可以切换swarm集群模式。立即启用swarm模式,使当前的机器成为群管员。从此,Docker将运行您在swarm群集上执行的命令,而不仅仅是在当前机器上执行的命令。

建立你的swarm

一个群体由多个节点组成,可以是物理机器或虚拟机器。基本概念很简单:运行docker swarm init以启用群模式,并使您的当前机器成为群管理员,然后在其他机器上运行docker swarm join,使得它们作为worker加入swarm。

创建一个集群

您需要一个可以创建虚拟机(VM)的虚拟机管理程序,因此请为您的计算机的操作系统安装Oracle VirtualBox: 到 https://www.virtualbox.org/wiki/Linux_Downloads 下载对应版本的安装包,我本机是Ubuntu 14.04(cat /proc/version), 下载对应的安装包,通过命令sudo dpkg -i 安装包 ,安装VirtualBox虚拟机 。

1、 docker-machine使用VirtualBox驱动程序创建几个VM :

docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2

2、您现在创建了两个虚拟机,分别命名为myvm1和myvm2。
使用此命令列出机器并获取其IP地址。

> docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.6
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.09.6

3、初始化swarm
第一台机器作为管理员,执行管理命令并认证worker加入swarm,第二台机器是worker。

您可以使用VM docker-machine ssh 发送命令道VMs。使用docker swarm init 将myvm1指定为swarm管理员,会看到如下输出:

# 命令样本
$ 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.

# 实例:
docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100"
Swarm initialized: current node (kdqjprd70ttjn5wvjwyv3w4jz) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-07bbgi7mgtw4kzdmh22ze8kza4vl68a1j3i33cyvp3pju4lqk5-8ohhhopc6xho5u7i1gfm1oete 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

端口2377和2376
始终使用端口2377(swarm 管理员 端口)运行docker swarm initdocker swarm join,或不设置端口,采用默认值。
docker-machine ls 返回的IP地址,包含端口2376 ,这是Docker守护程序端口。请勿使用此端口,否则 可能会遇到错误。

4、添加节点
docker swarm init 的返回中,包含一个预配置的 docker swarm join命令,让你可以在任何想添加的节点上运行。复制此命令,通过docker-machine ssh 并将这个命令发送给myvm2, 让myvm2 以worker身份加入的你的swarm中。

> docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-07bbgi7mgtw4kzdmh22ze8kza4vl68a1j3i33cyvp3pju4lqk5-8ohhhopc6xho5u7i1gfm1oete 192.168.99.100:2377"
This node joined a swarm as a worker.

5、查看节点
恭喜,你的第一个swarm创建了。
在管理员上运行 docker node ls ,查看节点(node)

>docker-machine ssh myvm1 "docker node ls"
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
kdqjprd70ttjn5wvjwyv3w4jz *   myvm1               Ready               Active              Leader              18.09.6
mpnk9t7q6dvlwir32sbwb2fmz     myvm2               Ready               Active                                  18.09.6

6、离开一个群

如果你想重新开始,你可以在每个节点运行docker swarm leave

> docker-machine ssh myvm2 "docker swarm leave"
Node left the swarm.

查看群中的节点:myvm2 的STATUS变成了Down

> docker-machine ssh myvm1 "docker node ls"
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
kdqjprd70ttjn5wvjwyv3w4jz *   myvm1               Ready               Active              Leader              18.09.6
mpnk9t7q6dvlwir32sbwb2fmz     myvm2               Down                Active                                  18.09.6

在群集上部署您的应用程序

重复part3 的步骤,部署一个新的swarm。注意只有swarm manager(myvm1)执行docker 命令,workers 只是提供容量。

为swarm manager配置一个 docker-machin shell

您一直在docker-machine ssh 中封装docker 命令来与VM对话。另一个选择是运行docker-machine env <machine>获取并运行一个命令,该命令配置当前shell与虚拟机上的Docker守护程序对话。

这种方法允许您使用本地docker-compose.yml文件“远程”部署应用程序,而无需将其复制到任何位置。

> docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/server1/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)

运行给定的命令来配置你的shell进行通信myvm1。

> eval $(docker-machine env myvm1)

运行docker-machine ls以验证它myvm1现在是激活的机器,通过 * 表示。

docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.03.0-ce
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.03.0-ce

使用docker-machine env和连接到VMdocker-machine ssh 的异同
  • 要将shell设置为与其他机器通信,比如myvm2,只需 docker-machine env在相同或不同的shell中重新运行同样的命令,指向myvm2。这始终指的是当前shell。如果更改为未配置的shell来打开新的shell,则需要重新运行这些命令。使用docker-machine ls列出的机器,看看他们是在什么状态,获取IP地址,并找出哪一个,如果有的话,说明您连接上了。

  • 或者,您可以用包装Docker命令的形势:docker-machine ssh <machine> "<command>", log直接记录到VM中,但是不能快速访问本地文件

  • 在Mac和Linux上,您可以使用docker-machine scp <file> <machine>:~ 跨机器复制文件,但Windows用户需要像Git Bash这样的Linux终端模拟器才能工作。

在swarm管理员上部署应用程序

切换到docker-compose.yml 所在的目录,像part3中一样部署应用

> docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web

该应用程序部署在swarm集群上了!
可以通过浏览器,或者curl命令访问web服务

> curl http://192.168.99.100:4000
<h3>Hello World!</h3><b>Hostname:</b> bc1cc8b22304<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>%          

> curl http://192.168.99.101:4000
<h3>Hello World!</h3><b>Hostname:</b> bc1cc8b22304<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>% 

清理并重新启动

堆栈和群集

你可以使用 docker stack rm 拆掉堆栈。例如:

docker stack rm getstartedlab

移除swarm

//移除worker
docker-machine ssh myvm2 "docker swarm leave" 

//移除manager
docker-machine ssh myvm1 "docker swarm leave --force" 
取消docker-machine shell变量设置
eval $(docker-machine env -u)

重新启动Docker机器

关闭本地主机,Docker机器将停止运行。

sudo reboot

检查机器的状态

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
myvm1   -        virtualbox   Stopped                 Unknown
myvm2   -        virtualbox   Stopped                 Unknown

重启已停止的机器

# docker-machine start <machine-name>

> docker-machine start myvm1
Starting "myvm1"...
(myvm1) Check network to re-create if needed...
(myvm1) Waiting for an IP...
Machine "myvm1" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

> docker-machine start myvm2
Starting "myvm2"...
(myvm2) Check network to re-create if needed...
(myvm2) Waiting for an IP...
Machine "myvm2" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command

命令回顾

与您的群集和虚拟机交互

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
查看token

像集群中添worker或者manager需要token,如何查看token

// 查看添加manager的token
> docker-machine ssh myvm1 "docker swarm join-token worker"
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1ht1ljgpiyq0nbc1lq08l7z34uumpyfl2blhojlmam9gznehk9-exgajpo0bsf5see42siap6h3g 192.168.99.100:2377

// 查看添加worker的token
> docker-machine ssh myvm1 "docker swarm join-token manager"
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1ht1ljgpiyq0nbc1lq08l7z34uumpyfl2blhojlmam9gznehk9-bcqcie3vlml60a2lhd09vgsux 192.168.99.100:2377
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值