我有 2 个 docker 镜像,每个镜像都有自己的静态 IP。如何从主机访问它们?这样大家都能ping通。
services:
first_server:
image: ubuntu:22.04
container_name: first_server
networks:
main_network:
ipv4_address: 192.168.0.197
second_server:
image: ubuntu:22.04
container_name: second_server
networks:
main_network:
ipv4_address: 192.168.0.198
您没有提供系统的详细信息,因此我们必须猜测。
main_network
- 是虚拟网络还是 macvlan/ipvlan?虚拟网络
Docker 将容器连接到虚拟网络。
如果您使用的是 Linux,那么 docker 会在主机上生成一个虚拟接口并配置路由,以便发往容器地址的数据包通过该接口。 Docker 在 Windows 上不会执行此操作。因此,如果您使用的是 Windows,则根本无法 ping 通。
证明。这实际上是一个非常糟糕的静态地址选择。通常,192.168.0.0/24 用于物理本地网络上的地址,容器被分配的地址如 10.xxx.xxx.xxx
docker compose
在 Linux 上启动了它。主机上出现虚拟接口路由表中已出现条目
平作品
现在让我们看看 Windows 中会发生什么。
而且,网络设置不仅在Windows中没有改变,而且在WSL中也没有改变。
因此,在 Windows 上将无法 ping 容器 - 网络子系统不知道将数据包发送到哪里。因此,网络驱动程序将向默认网关发送 ping 数据包,默认网关将丢弃它们,因为规则规定不应路由定向到本地地址的数据包。结果,ping 将无法到达任何地方。
macvlan/ipvlan 网络
macvlan 和 ipvlan 驱动程序在物理接口上产生额外的地址。 macvlan 创建一个额外的随机 MAC 地址,ipvlan 创建一个额外的 IP 地址。发往这些地址的数据包将传递到 docker。
由于我不知道的技术原因,主机本身无法将数据包发送到这些地址。因此,原则上不会从主机 ping 通此类地址。
在 Linux 中,此类地址是从外部计算机 ping 通的。我刚刚在我的办公室尝试过 - 连接到 macvlan 的容器响应来自相邻计算机的 ping。
在 Windows 上,docker 运行在 WSL 虚拟机内,因此基本上没有可以连接容器的物理接口。因此,在 Windows 上,此类容器不会从主机或相邻计算机执行 ping 操作。
像这样的东西。