Docker Swarm 服务发现与网络功能解析
1. Swarm 服务发现
在 Swarm 环境中,容器的名称和别名有特定的展示方式。例如,在 machine1 上运行的名为“bob”的容器将显示为“machine1/bob”。若要查看容器信息,可使用以下命令:
docker ps
如果系统中安装了
less
命令,可使用
-S
参数来处理长行输出并通过箭头导航:
docker ps | less -S
在查看输出时会发现,尽管 Swarm 配置为使用 Spread 算法,但所有容器都在同一台机器上运行。这是因为当第一个有依赖关系的容器被调度后,依赖过滤器会将其他节点从候选池中排除。
当环境运行起来后,就可以查询服务了。注意环境部署所在机器的名称,并将其替换到以下 cURL 命令中的
<MACHINE>
位置:
curl http://$(docker-machine ip <MACHINE>):8080/api/coffeeshops/
若系统中没有 cURL,也可以使用浏览器进行类似请求。请求的输出通常如下:
{
"coffeeshops": []
}
可以尝试对咖啡服务进行扩缩容操作,并观察 Swarm 对每个容器的调度位置。完成示例后,使用以下命令停止并移除容器:
docker-compose stop
docker-compose rm -vf
虽然在某些用例中对应用进行集群化是可行的,但常见用例的需求并未得到充分满足。服务器软件通常需要多主机分布和服务发现功能,社区为此构建并采用了一些新的和现有的工具来填补 Docker 集成解决方案的空白。
2. 生态系统服务发现与临时措施
网络服务发现的主要接口是 DNS。传统的 DNS 服务器软件存在一些问题,如使用大量缓存、难以提供高写入吞吐量,且通常缺乏成员监控功能,在频繁部署的系统中难以扩展。现代系统则使用支持高写入吞吐量、成员管理甚至分布式锁定功能的分布式键值数据库。
现代软件的示例包括 etcd、Consul、ZooKeeper 和 Serf。这些工具在实现上可能有很大差异,但都是优秀的服务发现提供者。不过,将这些基础设施相关的工具集成到容器层会泄露一些本应通过基本抽象隐藏的实现细节,降低应用的可移植性。理想的解决方案是在 Docker Engine 和 Docker Swarm 提供的集群或网络层集成服务注册和发现功能。借助支持多主机网络的 Docker Engine 和与可插拔键值存储集成的覆盖网络技术,这一目标有望实现。
以下是一个简单的表格,对比传统 DNS 与现代分布式键值数据库:
| 类型 | 缓存情况 | 写入吞吐量 | 成员监控 | 扩展性 |
| ---- | ---- | ---- | ---- | ---- |
| 传统 DNS | 大量使用 | 低 | 缺乏 | 差 |
| 现代分布式键值数据库 | 按需使用 | 高 | 支持 | 好 |
3. 展望多主机网络
Docker Engine 的实验分支将网络功能抽象到了一个可插拔的接口之后,该接口由多种驱动实现,包括 bridge、host 和 overlay。bridge 和 host 驱动实现了我们熟悉的单主机网络功能,而 overlay 驱动则通过 IP 封装或 VXLAN 实现了覆盖网络。覆盖网络为使用相同键值存储的 Docker 机器管理的每个容器提供可路由的 IP 地址。
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(Docker Engine 1):::process -->|网络通信| B(Swarm Manager):::process
C(Docker Engine 2):::process -->|网络通信| B
D(Docker Engine 3):::process -->|网络通信| B
A -->|容器通信| E(app_1):::process
A -->|容器通信| F(app_2):::process
C -->|容器通信| G(proxy_1):::process
D -->|容器通信| H(db_1):::process
B -->|服务发现| I(Key - value store):::process
E -->|服务注册| I
F -->|服务注册| I
G -->|服务注册| I
H -->|服务注册| I
有了覆盖网络,每个容器都能获得一个唯一的 IP 地址,并且可以从覆盖网络中的任何其他容器进行路由。应用无需再自行识别或宣传其主机 IP 地址,也无需将容器端口映射到主机端口,这些工作都由 Docker 和集成的键值存储在基础设施层完成。
在多主机网络功能正式发布到 Docker Engine 的稳定版本以及使用 Docker Machine 进行多主机 Swarm 节点配置之前,我们可以直接集成其他生态系统项目来满足需求。当这些功能正式落地时,将为开发者和系统架构师带来极大的便利。
4. 相关工具与技术总结
Docker Machine 和 Docker Swarm 为 Docker Engine 提供了增强功能,以下是对它们关键功能的总结:
-
Docker Machine
:
- 可使用
create
命令轻松创建本地虚拟机或云主机。
-
env
和
config
子命令能配置 Docker 客户端,使其与通过 Docker Machine 配置的远程 Docker 引擎协同工作。
| 子命令 | 功能 |
| ---- | ---- |
|
env
| 配置 Docker 客户端与远程 Docker 引擎通信的环境变量 |
|
config
| 查看 Docker 客户端与远程 Docker 引擎通信的配置信息 |
-
Docker Swarm
:
- 是一种与 Docker 远程 API 向后兼容的协议,为一组成员节点提供集群功能。
- 由 Swarm 管理器程序实现 Swarm API 并处理集群的容器调度。
- 提供三种调度算法,可通过过滤器进行调整。
- 在多主机网络功能发布前,会将依赖容器调度到同一节点。
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(Docker Machine):::process -->|创建| B(本地虚拟机/云主机):::process
A -->|配置| C(Docker 客户端):::process
C -->|通信| D(Docker 引擎):::process
E(Docker Swarm):::process -->|集群功能| D
E -->|调度算法| F(容器调度):::process
G(过滤器):::process -->|调整| F
5. 容器调度算法详解
Docker Swarm 提供了三种不同的调度算法,每种算法都有其特点和适用场景:
-
Spread 算法
:旨在将容器均匀分布到各个节点上,以充分利用集群资源。但在容器存在依赖关系时,可能会受到限制。例如,当第一个依赖容器被调度后,后续依赖容器可能会被调度到同一节点。
-
BinPack 算法
:尝试将容器尽可能紧密地打包到少数节点上,以提高资源利用率。该算法适用于资源紧张的场景。
-
Random 算法
:随机选择节点来调度容器,不考虑节点的资源使用情况。这种算法简单但可能导致资源分配不均衡。
以下表格对比了三种调度算法的特点:
| 算法名称 | 特点 | 适用场景 |
| ---- | ---- | ---- |
| Spread 算法 | 均匀分布容器 | 资源充足,希望均衡利用节点资源 |
| BinPack 算法 | 紧密打包容器 | 资源紧张,需要提高资源利用率 |
| Random 算法 | 随机调度容器 | 对资源分配要求不高,简单测试场景 |
6. 容器相关操作总结
在使用 Docker 过程中,涉及到众多容器操作命令,以下是一些常用命令的总结:
-
容器创建与运行
:
-
docker create
:创建容器但不启动。
-
docker run
:创建并启动容器。
-
容器管理
:
-
docker ps
:查看运行中的容器。
-
docker stop
:停止运行的容器。
-
docker start
:启动已停止的容器。
-
docker rm
:删除容器。
-
容器网络
:
-
docker network create
:创建网络。
-
docker network connect
:将容器连接到网络。
-
docker network disconnect
:将容器从网络断开。
| 操作类型 | 命令 | 说明 |
|---|---|---|
| 创建与运行 |
docker create
| 创建容器但不启动 |
| 创建与运行 |
docker run
| 创建并启动容器 |
| 管理 |
docker ps
| 查看运行中的容器 |
| 管理 |
docker stop
| 停止运行的容器 |
| 管理 |
docker start
| 启动已停止的容器 |
| 管理 |
docker rm
| 删除容器 |
| 网络 |
docker network create
| 创建网络 |
| 网络 |
docker network connect
| 将容器连接到网络 |
| 网络 |
docker network disconnect
| 将容器从网络断开 |
通过对 Docker Swarm 服务发现、网络功能以及相关工具和操作的深入了解,我们可以更好地利用 Docker 构建分布式容器集群,提高应用的可扩展性和可靠性。
超级会员免费看
26

被折叠的 条评论
为什么被折叠?



