博客
关于我
Docker网络之深挖overlay
阅读量:806 次
发布时间:2019-03-25

本文共 3382 字,大约阅读时间需要 11 分钟。

Docker Swarm 网络深度分析

Docker Swarm的网络架构设计确实非常巧妙,为容器化应用提供了强大的网络支持能力。本文将深入剖析Docker Swarm的网络实现机制,揭示官方文档中未提及的关键细节。

部署实例

首先,我们创建一个包含两个节点(node 1 和 node 2)的 Docker Swarm 集群。创建 swarm 集群的具体步骤不在本文详细阐述。接下来,我们创建一个 overlay 网络 net1 和三个服务:Redis、Node.js 和 Nginx。每个服务指定使用 net1 网络,这样可以确保服务之间的通信基于该 overlay 网络。

具体命令如下:

docker network create --option encrypted --subnet 100.0.0.0/24 -d overlay net1
docker service create --name redis --network net1 redis:latest
docker service create --name node --network net1 nvbeta/node:latest
docker service create --name nginx --network net1 -p 1080:80 nvbeta/swarm_nginx

这些命令创建了一个典型的三层架构:Nginx 作为负载均衡器,将请求转发到 Node.js 服务,而 Node.js 又通过调用 Redis 来获取数据并返回给 Nginx。为了简化起见,我们仅创建一个 Node 实例。

网络结构

在 Docker Swarm 中,网络分为几个关键部分:

  • net1 网络:这是一个 overlay 网络,用于容器之间的通信。
  • docker_gwbridge 网络:这是一个桥接网络,提供容器与宿主机之间的通信。
  • ingress 网络:默认创建的 overlay 网络,用于暴露外部服务和实现 routing mesh。
  • 此外,还可以看到 none 网络,它用于 container 操作时的临时通信。

    核心网络组件

    docker network ls 的输出可以看到:

    NETWORK ID          NAME                DRIVER              SCOPE
    cac91f9c60ff bridge bridge local
    b55339bbfab9 docker_gwbridge bridge local
    fe6ef5d2e8e8 host host local
    f1nvcluv1xnf ingress overlay swarm
    8vty8k3pejm5 net1 overlay swarm
  • net1 网络:负责容器间的通信,所有服务都指定使用此网络。
  • docker_gwbridge 网络:由 Docker 自动创建,用于容器与宿主机的通信。
  • ingress 网络:用于暴露外部服务,并管理 routing mesh,确保容器间的通信不受宿主机限制。
  • 通过 docker ps 命令可以观察到各个容器的状态:

    CONTAINER ID        IMAGE               COMMAND                  CREATED           STATUS             PORTS               NAME
    Seb03383913fb nvbeta/node:latest "nodemon /src/index.js" 2 hours ago Up 2 hours 8888/tcp node.1
    yscmxtoymkvs3bdd4z678w4434ce2679482 redis:latest "docker-entrypoint.sh" 2 hours ago Up 2 hours 6379/tcp redis.1

    此外,查看容器的网络配置,可以发现容器使用 overlay 网络进行通信。

    网络实现

    Docker Swarm 的网络架构主要基于以下技术:

  • Overlay 网络overlay 网络类型将多个宿主机连接成单个逻辑网络,确保容器在不同宿主机间通信。
  • Linux Bridge:用于宿主机和容器之间的通信,默认使用 docker_gwbridge
  • VxLAN(虚量化网络):通过 VTEP(虚拟化Ethernet impair)协议实现机制,允许多个子网在逻辑上连接到单个物理网络。
  • Ingress 网络:负责容器外部访问,基于 iptables 和 iptables 插件实现负载均衡和路由。
  • 具体网络拓扑

    通过 docker network inspectbrctl showbridge 等命令可以查看详细的网络拓扑信息:

    Name            Bridge id            STP enabled      Interface
    docker0 8000.0242e4567e9a no veth97d586b
    vethceaaebe 8000.024224f1afe8 no vethceaaebe
    ethefdaa0d 8000.0242e4567e9a no vethefdaa0d

    此外,使用 ip netns execip link 可以查看容器的网络接口及其对应的名称空间。

    服务间通信机制

    在 Docker Swarm 中,服务间通信基于 overlay 网络实现的高效 routing mesh:

    • net1 网络:负责容器间的直接通信。
    • docker_gwbridge 网络:允许容器与宿主机通信。
    • ingress 网络:完成外部请求的路由和负载均衡。

    通过 iptables -t nat 命令可以观察到网络路由规则,

    Chain DOCKER-INGRESS (policy ACCEPT 2 references)
    pkts bytes target prot opt in out source destination
    0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1080 to:172.18.0.2:1080

    这表明所有到宿主机 1080 端口的流量会被重定向到隐藏的 ingress-sbox 容器。

    负载均衡与路由

    Docker Swarm 的 routing mesh 机制确保了服务间的高效通信,无论服务运行在哪个节点,内部流量都能直接经过网络层而非传统的三次握手。

    通过 ipvsadm 可以看到负载均衡器的配置:

    IPVS: Thu Jan 14 16:38:51 2024 -> 1 server: 10.255.0.5:0
    FWM: Masq 1 0 0

    这个配置指示负载均衡将所有到达 10.255.0.5:0 的流量转发给后端服务。

    总结

    Docker Swarm 的网络设计极其巧妙,结合了 Overlay 网络、Linux Bridge、VxLAN 等技术,为容器化应用提供了高效、可靠的网络支持。深入理解这些机制对于开发与调试都是至关重要的。

    转载地址:http://nyvyk.baihongyu.com/

    你可能感兴趣的文章
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>
    MySQL 触发器
    查看>>
    mysql 让所有IP访问数据库
    查看>>
    mysql 记录的增删改查
    查看>>
    MySQL 设置数据库的隔离级别
    查看>>
    MySQL 证明为什么用limit时,offset很大会影响性能
    查看>>
    Mysql 语句操作索引SQL语句
    查看>>
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    查看>>
    MySQL 调优/优化的 101 个建议!
    查看>>
    mysql 转义字符用法_MySql 转义字符的使用说明
    查看>>
    mysql 输入密码秒退
    查看>>
    mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
    查看>>
    mysql 通过查看mysql 配置参数、状态来优化你的mysql
    查看>>
    mysql 里对root及普通用户赋权及更改密码的一些命令
    查看>>
    Mysql 重置自增列的开始序号
    查看>>
    mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
    查看>>