答案1
这对于标准网络命令来说是不可能的。几年前,Docker 明确拒绝了使这一切变得简单的功能(https://github.com/moby/moby/pull/8216)。
当然,您可以手动将接口移动到 Docker 容器的网络命名空间中,但这充满了问题:例如,每当您重新启动或重新创建容器时,您都必须重新配置网络。
要将接口添加到容器的网络命名空间:
获取容器的 PID:
container_pid=$(docker inspect <container_name_or_id> -f '{{ .State.Pid }}')
将接口分配给容器的命名空间:
ip link set netns ${container_pid} dev ${device}
你已经完成了......大部分。
如果您想在将接口添加到命名空间后对其进行配置,则必须执行以下任一操作:
使用额外的权限运行您的容器。可能只是,尽管您也可以在测试时
--cap-add=NET_ADMIN
使用。--privileged
用于
nsenter
从容器外部执行配置:nsenter -t ${container_pid} -n ip addr ...
虽然这一切都有效,但由于我注意到的限制,macvtap
如果我出于某种原因需要容器内的物理接口,我会坚持使用驱动程序。或者使用lxc
或systemd-nspawn
或其他一些容器化工具来使此特定任务变得更容易。