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

时间:2020-08-01 09:06:48

标签: docker networking routes containers macvlan

我正在尝试从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主机本身或网络上的其他客户端都无法访问该容器。

我遵循了他的码头工人站点的示例:https://docs.docker.com/network/network-tutorial-macvlan/#bridge-example

我还缺少什么?

我在这里Bind address in Docker macvlan中阅读了这些命令,以执行这些命令(不知道它们在做什么):

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

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

1 个答案:

答案 0 :(得分:1)

我相信主机是无法通过macvlan网络到达其自己的容器的。我让其他人解释为什么会这样,但是要验证这是问题所在,您可以尝试从网络上的另一台主机甚至从另一个容器或虚拟机ping 192.168.2.74上的容器在同一主机上。如果您可以从其他计算机而不是主机访问容器,则一切正常。

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

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

在主机子接口上创建一个macvlan接口:

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

在该macvlan界面上创建容器:

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

找到容器的IP地址:

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

目前,我们无法从主机ping容器IP“ 192.168.2.1”。

现在,让我们在同一网络中的地址为“ 192.168.2.10”的主机中创建macvlan接口。

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

现在,我们应该能够ping通容器IP并从主机访问“ nginx”容器。

$ 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