我正在尝试从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
但这对我的机器没有任何作用
答案 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