在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(桥接网络)方法。无论如何,它会起作用吗?
谢谢。
在 Docker 中,macvlan 网络驱动程序允许您为容器的虚拟网络接口分配 MAC 地址和 IP 地址,使其显示为网络上的标准设备。连接到 macvlan 网络的每个容器都有其唯一的 IP 地址,该地址可以在 LAN 内访问,也可以从外部网络访问,具体取决于网络的配置。
然而,根据 Docker 文档和标准实践,macvlan 网络不提供一种机制来按照您所描述的方式分配在一组容器之间共享的 IP 地址 - 其中多个容器本质上表现为具有单个 IP 的容器macvlan 网络上的地址。macvlan 网络上的每个容器通常都有自己唯一的 IP 地址。
主要原因是 IP 地址与网络接口相关联,每个容器在连接到 macvlan 网络时都会获得其虚拟网络接口。您所描述的尝试将 IP 地址分配从服务级别移动到网络定义的方法将不起作用,因为 IP 地址分配必须在每个容器(每个服务)的基础上完成。Docker 的 macvlan 目前不支持将单个 IP 分配给多个容器,因为它破坏了 macvlan 所遵循的 IP 网络的基本设计(每个网络接口一个 IP)。
Docker 中的 Macvlan 驱动程序主要适用于您希望容器在网络上显示为物理主机的场景,每个主机都有自己的 IP 地址,而不是共享单个 IP。如果您需要通过单个 IP 访问多个服务(容器),您通常会将它们放在负载均衡器或反向代理后面,这些代理将根据您的配置(端口、路径等)管理各个容器的传入流量。 )。
如果您想为一组服务拥有静态 IP,最好的选择是配置外部设备或服务(例如负载均衡器或反向代理)以拥有静态 IP 并将请求转发到适当的容器它们各自由 macvlan 分配的 IP 地址。这使每个容器都具有唯一的 IP,同时通过负载均衡器的静态 IP 呈现统一的前端。
如果您使用的是 Mac 或 Windows 版 Docker,您应该注意,由于网络命名空间的实现方式,macvlan 网络不允许主机本身与 macvlan 连接的容器进行通信,因此存在持续的限制。可以按照 GitHub 上的建议,通过在主机上创建 macvlan 接口来解决 Linux 主机上的问题,但这种解决方法可能不适用,或者可能需要在其他操作系统上执行不同的步骤。