如何配置 podman 容器以使其也能与主机通信?

如何配置 podman 容器以使其也能与主机通信?

是否有可能...

  • 使用 podman 运行容器
  • 其 IP 与主机位于同一子网
  • 可从子网上的所有其他主机访问
  • 包括主持人本身

使用 macvlan 和 ipvlan 驱动程序我获得了部分成功 - 我能够运行一个容器,给它一个 IP 地址,然后网络上的所有其他主机都可以访问这个 IP。

但是,我无法访问或访问运行容器的主机。

我甚至尝试使用最新版本的吊舱网路科技cni-插件从源代码构建,启用 ipvlan 驱动程序并产生相同的结果。

我更希望有一个指向指南的指针来描述如何实现这一点,尽管也欢迎故障排除建议。

答案1

为此,我只需要在主机上添加一个额外的 ipvlan 接口,这样如果 podman 也使用 ipvlan,我就可以与容器对话。

  • 指定主机将从哪个网络访问此容器。例如,10.0.0.0/16
  • 分配一个子网供容器使用。最好是家庭网络的子网。例如10.0.99.0/24。该子网应专用于此主机上的容器。
  • 创建一个 ipvlan podman 网络供容器使用。它将与主机网络位于同一子网,但 IP 分配应从较小的子网中定义。例如:
sudo podman network create -d ipvlan --subnet 10.0.0.0/16 --ip-range 10.0.99.0/24 --ipam-driver host-local podnet
  • 创建主机 IPVlan 接口并为其分配容器网络的 IP 地址。例如10.0.99.1。这是主机可以用来与容器通信的接口。
  • 更新 podman 网络以跳过主机使用的 IP 地址: sudo vim /etc/cni/net.d/podnet.conflist 并将 rangeStart 从 更改10.0.99.110.0.99.2

要使用 systemd 创建 ipvlan 接口,我必须

  1. 在定义我的主机网络接口的文件部分添加一个,这将创建一个IPVLAN = podnet插入父级的网络接口。[Network]podnet
  2. 创建接口的配置:
cat > /etc/systemd/network/podnet.netdev <<EOF
[NetDev]
Name = podnet
Kind = ipvlan
EOF
cat > /etc/systemd/network/podnet.network <<EOF
[Match]
Name = podnet
[Network]
IPForward = yes
Address = 10.0.99.1/24
EOF

平心而论,同样的方法也可以用 macvlan 代替 ipvlan,但是我的网络的某些部分无法通过 MACVlan 接口访问主机,因此我切换到 IPVlan 以获得更好的互操作性。

我遇到的另一个问题是 podman 默认使用 netavark,而 netavark IPVlan 支持仅在 podman 4.5+ 中可用,而我还在使用 4.3。切换网络后端解决了cni此问题。

cat > /etc/containers/containers.conf <<EOF
[network]
network_backend = "cni"
EOF

答案2

不完全是你所要求的,但你可以很简单地分享同一个 IP 地址作为主持人,请继续阅读,看看是否对您有帮助:

您需要做的是添加到podman run--network=host 实质上意味着您与主机共享相同的网络堆栈,因此您应该考虑以下几点:

  • 您不能使用与主机相同的监听端口。例如 - 如果您以端口 80 运行服务器,则主机无法执行此操作。
  • 您的容器可以访问主机上的本地(127.0.0.1)服务,反之亦然。基本上,通过这种方式,您的“限制”程度会小得多。这有利有弊,请确保您知道自己在做什么。

相关内容