如何将物理网卡直通到 Docker 容器?

Mil*_*deh 3 containers docker docker-networking

是否可以在不安装额外插件的情况下将 eth(n) 传递到 Docker 容器?

在 LXC/LXD 中,通过以下命令很容易:

lxc config device add CONTAINER-NAME eth2 nic nictype=physical parent=eth2 name=eth2
Run Code Online (Sandbox Code Playgroud)

小智 6

可以将网络接口移动到容器 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"
Run Code Online (Sandbox Code Playgroud)

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

ip netns exec "$NSPID" ip link set "$HOST_IFACE" name "$CONT_IFACE_NAME"
Run Code Online (Sandbox Code Playgroud)

设置它

ip netns exec "$NSPID" ip link set "$CONT_IFACE_NAME" up
Run Code Online (Sandbox Code Playgroud)


pri*_*ath 5

您不能直接将网卡附加到容器,但您可以使用 MACVLAN 网络并将网卡用作父接口

检查您的 NIC 子网

ip addr show eth2
Run Code Online (Sandbox Code Playgroud)

应该返回类似的东西

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
Run Code Online (Sandbox Code Playgroud)

现在在同一个子网中创建一个 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
Run Code Online (Sandbox Code Playgroud)

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

docker run -itd --net=docker_macvlan --name macv1 --ip=172.16.86.15 ubuntu /bin/bash 
Run Code Online (Sandbox Code Playgroud)