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

Mar*_*arc 10 networking containers routes docker macvlan

我试图了解 docker 的“macvlan”网络。我创建一个新网络:

docker network create -d macvlan \
  --subnet=192.168.2.0/24 \
  --gateway=192.168.2.1 \
  -o parent=eno1 \
  pub_net
Run Code Online (Sandbox Code Playgroud)

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

docker run --rm -d --net=pub_net --ip=192.168.2.74 --name=whoami -t jwilder/whoami
Run Code Online (Sandbox Code Playgroud)

当我尝试从容器访问服务或 ping 它时,我得到:

curl: (7) Failed to connect to 192.168.2.74 port 8000: no route to host
Run Code Online (Sandbox Code Playgroud)

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

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

我缺少什么?

我在这里读到了在 Docker macvlan 中绑定地址来执行这些命令(不知道它们做了什么):

docker run --rm -d --net=pub_net --ip=192.168.2.74 --name=whoami -t jwilder/whoami
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*oph 12

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

\n

根据这篇博客文章,您仍然可以通过在主机接口上创建 macvlan 接口来允许主机容器通信,然后在主机中创建 macvlan 接口,以便让它访问容器所在的 macvlan。

\n

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

\n
\n

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

\n
docker network create -d macvlan \\\n\xe2\x80\x93subnet=192.168.0.0/16 \\\n\xe2\x80\x93ip-range=192.168.2.0/24 \\\n-o macvlan_mode=bridge \\\n-o parent=eth2.70 macvlan70\n
Run Code Online (Sandbox Code Playgroud)\n

在该 macvlan 接口上创建容器:

\n
docker run -d \xe2\x80\x93net=macvlan70 \xe2\x80\x93name nginx nginx\n
Run Code Online (Sandbox Code Playgroud)\n

查找容器的ip地址:

\n
docker inspect nginx | grep IPAddress\n\xe2\x80\x9cSecondaryIPAddresses\xe2\x80\x9d: null,\n\xe2\x80\x9cIPAddress\xe2\x80\x9d: \xe2\x80\x9c\xe2\x80\x9d,\n\xe2\x80\x9cIPAddress\xe2\x80\x9d: \xe2\x80\x9c192.168.2.1\xe2\x80\x9d,\n
Run Code Online (Sandbox Code Playgroud)\n

此时,我们无法从主机 ping 容器 IP \xe2\x80\x9c192.168.2.1\xe2\x80\x9d。

\n

现在,让 \xe2\x80\x99s 在同一网络中地址为 \xe2\x80\x9c192.168.2.10\xe2\x80\x9d 的主机中创建 macvlan 接口。

\n
sudo ip link add mymacvlan70 link eth2.70 type macvlan mode bridge\nsudo ip addr add 192.168.2.10/24 dev mymacvlan70\nsudo ifconfig mymacvlan70 up\n
Run Code Online (Sandbox Code Playgroud)\n

现在,我们应该能够 ping 容器 IP 并从主机访问 \xe2\x80\x9cnginx\xe2\x80\x9d 容器。

\n
$ ping -c1 192.168.2.1\nPING 192.168.2.1 (192.168.2.1): 56 data bytes\n64 bytes from 192.168.2.1: seq=0 ttl=64 time=0.112 ms\n\n\xe2\x80\x94 192.168.2.1 ping statistics \xe2\x80\x94\n1 packets transmitted, 1 packets received, 0% packet loss\nround-trip min/avg/max = 0.112/0.112/0.112 ms\n
Run Code Online (Sandbox Code Playgroud)\n
\n