docker macvlan - 没有到主机(容器)的路由

docker macvlan - no route to host (container)

我正在尝试了解 docker 中的“macvlan”网络。我创建了一个新网络:

docker network create -d macvlan \
  --subnet=192.168.2.0/24 \
  --gateway=192.168.2.1 \
  -o parent=eno1 \
  pub_net

并使用新网络启动新容器:

docker run --rm -d --net=pub_net --ip=192.168.2.74 --name=whoami -t jwilder/whoami

当我尝试从容器访问服务或对它执行 ping 操作时,我得到:

curl: (7) Failed to connect to 192.168.2.74 port 8000: no route to host

使用 Ubuntu 16.04、Ubuntu 18.04 和 CentOS 7 进行测试。 docker 主机本身或网络上的其他客户端都无法访问容器。

我按照 docker 站点的示例进行操作:https://docs.docker.com/network/network-tutorial-macvlan/#bridge-example

我缺少什么?

我在这里阅读 来执行这些命令(不知道它们做了什么):

sudo ip link add pub_net link eno1 type macvlan mode bridge
sudo ip addr add 192.168.2.22/24 dev pub_net

但这对我的机器没有任何作用

我认为主机无法通过 macvlan 网络访问其自己的容器是设计使然。我把它留给其他人来解释为什么会这样,但是要验证这就是您的问题所在,您可以尝试从网络上的另一台主机甚至从另一个容器或虚拟机在 192.168.2.74 处 ping 您的容器在同一台主机上。如果您可以从其他机器而不是主机访问容器,则一切正常。

根据 this blog post,您仍然可以通过在主机 sub 接口上创建一个 macvlan 接口来允许 host-container 通信,然后创建一个 macvlan主机中的接口,以便让它访问容器所在的 macvlan。

我自己还没有尝试过,我不确定确切的后果,所以我在这里引用 the blog post 的说明,以便其他人可以在必要时添加:

Create a macvlan interface on host sub-interface:

docker network create -d macvlan \
–subnet=192.168.0.0/16 \
–ip-range=192.168.2.0/24 \
-o macvlan_mode=bridge \
-o parent=eth2.70 macvlan70

Create container on that macvlan interface:

docker run -d –net=macvlan70 –name nginx nginx

Find ip address of Container:

docker inspect nginx | grep IPAddress
“SecondaryIPAddresses”: null,
“IPAddress”: “”,
“IPAddress”: “192.168.2.1”,

At this point, we cannot ping container IP “192.168.2.1” from host machine.

Now, let’s create macvlan interface in host with address “192.168.2.10” in same network.

sudo ip link add mymacvlan70 link eth2.70 type macvlan mode bridge
sudo ip addr add 192.168.2.10/24 dev mymacvlan70
sudo ifconfig mymacvlan70 up

Now, we should be able to ping the Container IP as well as access “nginx” container from host machine.

$ ping -c1 192.168.2.1
PING 192.168.2.1 (192.168.2.1): 56 data bytes
64 bytes from 192.168.2.1: seq=0 ttl=64 time=0.112 ms

— 192.168.2.1 ping statistics —
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.112/0.112/0.112 ms