4

Im trying to understand the "macvlan" network from docker. I create a new network:

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

And start new container with the new network:

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

When i try to access the service from the container or ping it i get:

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

Tested with Ubuntu 16.04, Ubuntu 18.04 & CentOS 7. Neither from the docker host itself or other clients on the network can reach the container.

I followed the example fromt he docker site: https://docs.docker.com/network/network-tutorial-macvlan/#bridge-example

What im missing ?

I read here Bind address in Docker macvlan to execute these commands (no clue what they do):

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

But this does nothing on my machine(s)

4

1 回答 1

5

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

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

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

在主机子接口上创建一个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

查找 Container 的 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
于 2020-09-09T07:35:35.090 回答