如何将物理NIC传递到Docker容器?

时间:2020-02-12 13:34:25

标签: docker containers docker-networking

是否可以在不进行额外插件安装的情况下将eth(n)传递给Docker Container?

在LXC / LXD中,使用此命令很容易:

lxc config device add CONTAINER-NAME eth2 nic nictype=physical parent=eth2 name=eth2

4 个答案:

答案 0 :(得分:3)

您不能将NIC直接连接到容器,但是可以使用MACVLAN网络并将NIC用作父接口

检查您的NIC子网

ip addr show eth2

应返回类似

的内容
3: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP       group default qlen 1000
inet 172.16.86.250/24 brd 172.16.86.255 scope global eth2

现在在同一子网中创建MACVLAN网络。我使用172.16.86.1作为网络网关/路由器

docker network create -d macvlan \
--subnet=172.16.86.0/24 \
--gateway=172.16.86.1  \
-o parent=eth2 docker_macvlan

然后启动一个容器并将其附加到MACVLAN网络,并为它提供一个与NIC在同一子网中的IP地址,例如172.16.86.15

docker run -itd --net=docker_macvlan --name macv1 --ip=172.16.86.15 ubuntu /bin/bash 

答案 1 :(得分:2)

可以将网络接口移至容器NET NAMESPACE(基于我将SR-IOV VF接口移至容器的经验的示例):

HOST_INTERFACE=enp4s6f5
CONT_IFACE_NAME=eth255
container=debian-test

NSPID=$(docker inspect --format='{{ .State.Pid }}' $container

ip link set "$HOST_IFACE" netns "$NSPID"

如果界面很重要,可以在设置UP之前进行更改

ip netns exec "$NSPID" ip link set "$HOST_IFACE" name "$CONT_IFACE_NAME"

设置

ip netns exec "$NSPID" ip link set "$CONT_IFACE_NAME" up

答案 2 :(得分:1)

不可能将网络接口直接传递到容器。 Docker守护程序具有许多可以连接容器的网络。这些通常是称为桥接网络的虚拟网络。守护程序充当通往外界的路由器。

但是,可以使用--network host的{​​{1}}选项来指定主机网络。主机网络允许容器访问主机网络。这仅适用于Linux的Docker,不适用于Mac或Window的Docker。

从外部访问容器的通常方法是将端口从容器映射到主机上的端口。对映射的主机端口的请求将路由到容器端口。

答案 3 :(得分:1)

到目前为止,还没有将网络接口直接传递到容器的模式或机制。但是,有些网络插件允许直接/直通访问以太网网络设备到Docker容器

桥接模式具有一个用于主机名称空间的接口,并且主机上的所有容器都通过veth对连接到docker0。在这里,docker0是由docker守护进程创建的linux桥。码头工人将私有IP分配给容器

在主机模式下,主机的网络名称空间应与外界共享。在此,端口映射可用于访问服务。在这里,容器共享Docker主机的IP。请参考Networking using host network。在容器需要处理大量端口的情况下,主机模式网络很有用。

此处引用了基于macvlan的sample application,这也可能有所帮助。您可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配MAC地址,使其看起来像是直接连接到物理网络的物理网络接口。这样可以确保对于您网络上的网络设备,您的容器似乎已物理连接到网络。

相关问题