与docker-compose容器组共享macvlan ip地址

与docker-compose容器组共享macvlan ip地址

docker-compose容器组中,容器不需要地址,因为它们可以使用 Docker 仅为该组成员提供的伪 DNS 相互通信。然后,要与外部通信,这是 Docker 喜爱的标准 NAT 回归事务。

但是,如果我使用基于 macvlan 网络的 IP 寻址怎么办?我如何分配与整个组共享的地址,而不是仅分配给组中的单个服务。我找到的所有示例和文档不仅不是官方的,而且还在撰写文件中将地址应用于服务级别。从来没有提及或暗示其他选择。

如果我将这些包含 IP 地址的行从服务中移出并移到引用 Compose 文件中 macvlan docker 网络的部分,然后让服务与以前一样,这样它们就会使用 NAT 悲剧,但至少位于主机的独立地址之后,这样可以吗?

我在 GitHub 上找到了这个代码片段作为示例:

#
# macvlan def
docker network create -d macvlan \
    --subnet=192.168.0.0/24 \
    --gateway=192.168.0.1 \
    --ip-range=192.168.0.100/28 \
    -o parent=eth0 vdsm

#
# compose file
services:
  dsm:
    container_name: dsm
    ..<snip>..
    networks:
      vdsm:
        ipv4_address: 192.168.0.100  ╮
                                     │ ↙︎ MOVE SOMEWHERE DOWN HERE 
networks:       ╭────────────────────╯
  vdsm:         ↓ ← macvlan/EXT NETWORK REF
    external: true       

我猜这有点像混合 macvlan+NAT(桥接网络)方法。无论如何,这可行吗?

谢谢。

答案1

在 Docker 中,macvlan 网络驱动程序允许您为容器的虚拟网络接口分配 MAC 地址,从而分配 IP 地址,使其在您的网络上显示为标准设备。连接到 macvlan 网络的每个容器都具有唯一的 IP 地址,该地址可在 LAN 内访问,也可能从外部网络访问,具体取决于您的网络配置。

但是,根据 Docker 文档和标准做法,macvlan 网络不提供以您描述的方式分配跨一组容器共享的 IP 地址的机制 - 在 macvlan 网络上,多个容器本质上表现为具有单个 IP 地址的一个容器。macvlan 网络上的每个容器通常都有自己唯一的 IP 地址。

主要原因是 IP 地址与网络接口相关联,每个容器在连接到 macvlan 网络时都会获得其虚拟网络接口。您所描述的方法试图将 IP 地址分配从服务级别移至网络定义,但这种方法行不通,因为 IP 地址分配必须基于每个容器(每个服务)进行。Docker 的 macvlan 目前不支持将单个 IP 分配给多个容器,因为它破坏了 IP 网络的基本设计(每个网络接口一个 IP),而 macvlan 遵循这一设计。

Docker 中的 Macvlan 驱动程序主要用于您希望容器在网络上显示为物理主机的情况,每个容器都有自己的 IP 地址,而不是共享单个 IP。如果您需要通过单个 IP 访问多个服务(容器),您通常会将它们放在负载均衡器或反向代理后面,这些代理将根据您的配置(端口、路径等)管理传入各个容器的流量。

如果您想要为一组服务设置静态 IP,最佳选择是配置外部设备或服务(例如负载均衡器或反向代理)以设置静态 IP,并将请求转发到 macvlan 分配的相应 IP 地址上的相应容器。这样可以让每个容器都拥有唯一的 IP,同时通过负载均衡器的静态 IP 呈现统一的前端。

如果您使用的是 Mac 或 Windows 版 Docker,则应注意,由于网络命名空间的实现方式,macvlan 网络不允许主机本身与 macvlan 连接的容器进行通信,这是一个持续的限制。这可以在 Linux 主机上通过在主机上创建 macvlan 接口来解决,如 GitHub 上所建议的那样,但这种解决方法可能不适用或可能需要在其他操作系统上执行不同的步骤。

相关内容