將網頁連結專門綁定到 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或其他一些容器化工具來使此特定任務變得更容易。

相關內容