将网络链接专门绑定到 Docker 容器

将网络链接专门绑定到 Docker 容器

使用 Docker 是否可以将主机网络链接专门绑定到 Docker 容器?

换句话说,移动eth1(或其他)到一个容器中,以便它仅对该容器可用 - 主机或在主机上运行的任何其他容器/虚拟机等都不应访问它。

在 Linux 容器(LXC)中,这很简单,有一种phys网络类型可以做到这一点:

物理:将指定的已存在接口分配lxc.net.[i].link给容器。

我不是询问路线或使用 macvlan 或其他黑客

理想情况下,使用标准 Docker 命令可以实现这一点,但从我所读到的内容来看,我担心 Docker 的网络实现不支持这一点。使用命令的可能解决方法ip总比没有好。

答案1

这对于标准网络命令来说是不可能的。几年前,Docker 明确拒绝了使这一切变得简单的功能(https://github.com/moby/moby/pull/8216)。

当然,您可以手动将接口移动到 Docker 容器的网络命名空间中,但这充满了问题:例如,每当您重新启动或重新创建容器时,您都必须重新配置网络。


要将接口添加到容器的网络命名空间:

  1. 获取容器的 PID:

    container_pid=$(docker inspect <container_name_or_id> -f '{{ .State.Pid }}')
    
  2. 将接口分配给容器的命名空间:

    ip link set netns ${container_pid} dev ${device}
    

你已经完成了......大部分。

如果您想在将接口添加到命名空间后对其进行配置,则必须执行以下任一操作:

  • 使用额外的权限运行您的容器。可能只是,尽管您也可以在测试时--cap-add=NET_ADMIN使用。--privileged

  • 用于nsenter从容器外部执行配置:

    nsenter -t ${container_pid} -n ip addr ...
    

虽然这一切都有效,但由于我注意到的限制,macvtap如果我出于某种原因需要容器内的物理接口,我会坚持使用驱动程序。或者使用lxcsystemd-nspawn或其他一些容器化工具来使此特定任务变得更容易。

相关内容