答案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.1
为10.0.99.2
。
要使用 systemd 创建 ipvlan 接口,我必须
- 在定义我的主机网络接口的文件部分添加一个,这将创建一个
IPVLAN = podnet
插入父级的网络接口。[Network]
podnet
- 创建接口的配置:
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)服务,反之亦然。基本上,通过这种方式,您的“限制”程度会小得多。这有利有弊,请确保您知道自己在做什么。