Docker Machine、Compose 和 Swarm:它们如何协同工作

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在过去的一年里,Docker 一直在努力创建简单易用的工具来设置容器主机 (Machine)、管理链接在一起的多个容器 (Compose),以及将容器主机视为一个集群 (Swarm)。

尽管它们本来就很简单,但这些工具非常强大,并且在您运行并在您最喜欢的基础设施即服务之上部署大量容器之前,它们需要一些计划。我将尝试阐明为什么它们很适合您的工具带、它们应该在哪里使用以及如何开始使用它们。

这三个工具现在被整齐地打包到所谓的 Docker 工具箱 中。在继续之前确保你已经安装了它。

码头机

我们将从工具箱中看到的第一个工具是 Docker Machine,它将帮助您在许多最流行的基础设施即服务平台上创建容器主机。当然,您可以使用两个最流行的桌面虚拟化平台:VMware Fusion 和 VirtualBox,但它也支持其他平台,例如 AWS、Azure、DigitalOcean、Exoscale、Google Compute Engine、OpenStack、RackSpace、SoftLayer、VMware vSphere 和 vCloud空气。

让我们从在本地桌面上启动并运行容器主机开始。当您安装了 Docker 工具箱时,您还安装了 VirtualBox,所以让我们使用它来创建一个 Linux VM,我们可以在其中运行我们的容器。要创建容器主机,只需运行以下命令:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

此命令将告诉 Docker Machine 使用 VirtualBox 驱动程序创建一个名为“containerhost”的容器主机。我们现在有地方可以运行我们的容器了!让我们通过运行以下命令来配置我们的终端以连接到它:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

如果您习惯使用 Docker Toolbox 的前身 Boot2Docker,则上述命令类似于熟悉的 boot2docker shellinit

在对 Docker Machine env 变量进行评估后,您现在可以运行常规 Docker 命令,例如 docker run、pull、ps、rm 等。试试吧!

码头工人组成

现在我们已经启动并运行了一个容器主机,我们将更多地关注在它上面实际运行一些有用的容器。为此,我们将使用 Docker Compose。它实际上是建立在 Docker 于 2014 年首次收购的基础上,一家名为 Orchard 的公司创建了一个名为 Fig 的多容器管理工具。Docker 和来自 Orchard 的新加入团队继续了 Orchard 所做的伟大工作,并最终将其更名为去年年底的 Docker Compose。

Docker Compose 有一种简单的方法将应用程序描述为多个一起工作的容器、它们应该如何链接以及应该向最终用户公开哪些端口。 Docker 容器环境在“docker-compose.yml”文件中定义;让我们看一个例子并将其分解一下:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

这里我们有一个使用两个容器构建的应用程序。第一个容器称为“web”,将从当前工作目录中的 Dockerfile 构建。如果您已经为您的容器镜像创建了一个 Dockerfile,但还没有将它推送到注册中心,那么这就很棒了。可以 在此处找到 此示例的完整 Dockerfile 和必要的应用程序文件。

下一行显示哪些端口将在主机上公开,以及流量将转发到哪个端口进入容器。第三部分显示我们将把一个 Docker 卷挂载到容器中,其中包含应用程序代码。然后最后我们将链接到另一个我们称之为“redis”的容器,它将使用来自 Docker Hub 的标准官方 Redis 镜像。

现在要运行它,我们发出以下命令:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

这将读取 docker-compose.yml 并创建我们在其中定义的应用程序环境,首先从 Dockerfile 构建 Web 应用程序并下载 redis 映像。 Docker Compose 还会将 Web 容器链接到 Redis 容器。它看起来像这样:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

你有它!您已经成功地使用 Docker Compose 创建了一个包含两种服务的容器化环境:一种是面向外的 Web 服务,另一种是持久层。现在让我们看一下网页以验证应用程序是否正在运行。

要查找容器主机的 IP,请运行以下命令:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

由于我们还确保在容器主机上打开端口 5000 并将其链接到容器,您现在应该能够连接到 http://192.168.99.101:5000。您应该会看到消息,“Hello World!我见过 1 次。”您现在正在访问一个网站,该网站将点击计数器值存储在一个单独的容器化键值存储中,在网站上的每个新点击中检索该值并将其呈现给您。惊人的!

好了,现在我们已经解释了 Docker Compose 的基础知识,是时候深入探讨下一个主题了。

码头群

最后,让我们看看当前 Docker Toolbox 中最有趣的工具 Docker Swarm。到目前为止,您所做的是使用一个容器主机并运行一个或两个容器,这非常适合测试或本地开发。借助 Docker Swarm,我们现在要将这个小型测试环境转变为更大的集群容器主机设置,可用于将您的操作扩展为更有用的东西。这有点高级,将涉及服务发现、集群和远程管理等内容。

让我们从清理我们拥有的环境开始,这样我们就不会在运行大量东西时遇到任何问题。通过运行以下命令停止并删除当前本地容器主机:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

现在让我们开始创建一个新的容器主机,我们将在短时间内使用它:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

这为我们创建了一个名为“本地”的新容器主机。通过运行以下命令获取终端的正确连接信息:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

现在我们需要生成所谓的“发现令牌”,用于配置并确保您的节点是正确集群的一部分:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

最后一行是您的发现令牌,与我的不同。发现令牌实际上是使用 Docker 的公共发现服务创建的。您可以访问 https://discovery.hub.docker.com/v1/clusters/YOURTOKENHERE 等地址,找到它保存在集群上的信息。您将为所有新的 Swarm 成员使用这个新令牌,包括我们像这样创建的 Swarm Master:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

现在我们将创建我们的前两个 Swarm 节点:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

您现在还可以关闭并删除“本地”容器主机;我们将不再需要它了。

现在让我们确保您的 shell 指向 Swarm Master:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

您现在有一个 Swarm Master 和两个在本地运行的 Swarm 节点。让我们看看它是什么样的:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

太棒了!只需几分钟的工作,您现在就可以完全控制容器主机集群。我觉得那真是太棒了!

您现在可以尝试像往常一样运行容器。有时客户端需要一段时间才能用容器的唯一 ID 进行响应,所以只需等待它返回即可:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

现在列出容器,通过查看它们的给定名称来查看它们被安排在不同的集群主机上:


 $ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

好工作!您现在拥有一个由您控制的容器主机集群,可用于跨集群调度容器。

不幸的是,Docker Compose 和 Docker Swarm 之间的集成目前还不完整。但是正在努力使它们在不久的将来适当地兼容;你可以 关注这里的工作

在那之前,尽情享受可以在您新创建的集群上运行的有趣应用程序吧!

最初出现在 Jonas Rosland 的 Codeship 博客 上。