【问题标题】:Docker container with DHCP assigned address具有 DHCP 分配地址的 Docker 容器
【发布时间】:2018-08-16 08:50:00
【问题描述】:

我有一台运行着多个虚拟机的服务器。我正在启动一个装有 Jira 的容器,我需要为容器分配与 DHCP 不同的地址,而不是使用主机 IP 地址。我是菜鸟,请解释一下

【问题讨论】:

  • 您是在虚拟机中运行 docker 还是直接在主机服务器上运行?
  • 直接在主机上。

标签: docker networking kvm


【解决方案1】:

@ad22 的回答中建议的技术需要自定义构建使用 libnetwork 分支的 Docker 引擎。现在,在那个 hack 被开发四年多之后,DHCP 功能仍然没有被合并到标准的 Docker 引擎中,并且 fork 已经远远落后于主线代码。

自 2019 年底以来,可以使用devplayer0's docker-net-dhcp plugin 使用 DHCP 为 Docker 容器分配 IP 地址,这与标准 Docker 引擎配合使用。当您创建新容器时,此插件会启动 Busybox udhcpc 客户端以获取 DHCP 租约,然后运行 ​​udhcpc(在容器的 PID 命名空间之外的进程中)以根据需要续订租约。

【讨论】:

    【解决方案2】:

    正如在另一个答案中发现的那样,使用 macvlan 不会使容器能够从 DHCP 获取地址。从 DHCP 获取地址的功能是实验性的(这是由与 docker libnetwork 项目相关的人创建的)

    https://gist.github.com/nerdalert/3d2b891d41e0fa8d688c

    它建议将更改编译到 docker 二进制文件中然后运行

    docker network create -d macvlan \
      --ipam-driver=dhcp \
      -o parent=eth0 \
      --ipam-opt dhcp_interface=eth0 mcv0
    

    由于这需要重新编译二进制文件,一个替代解决方案可能是 使用 docker run/compose 的“--ip”选项为所有容器分配静态 IP 地址,并获取分配给此 IP 的主机名的 DNS 条目,并确保永远不能通过 DHCP 分配 IP。

    【讨论】:

      【解决方案3】:

      您可以使用 docker network macvlan 驱动程序来实现这一点。根据docs

      ...您可以使用 macvlan 网络驱动程序为每个容器的虚拟网络接口分配一个 MAC 地址,使其看起来是直接连接到物理网络的物理网络接口。

      所以本质上,虚拟网络接口将使用主机上暴露的物理网络接口来通告它自己的虚拟 MAC 地址。然后这将被广播到运行 DHCP 服务器的 LAN,并且虚拟接口将被分配一个 IP。

      实现它的步骤是:

      1. 创建一个使用 macvlan 驱动程序的 docker 网络:

        docker network create \
          --driver macvlan \
          --subnet=172.16.86.0/24 \
          --gateway=172.16.86.1  \
          --opt parent=eth0 lan_net
        

        子网和网关将是您的 LAN 网络(DHCP 所在的)的子网和网关。 parent 选项指定主机 上的物理接口,您希望通过该物理接口将虚拟接口暴露给 LAN 网络。

      2. 使用新创建的网络运行您的容器:

        docker run -it --rm --net=lan_net alpine
        

      【讨论】:

      • 我试过了,但这并没有从 DHCP 获取 IP 地址。它只分配与网络中相同的地址,但这些地址对网络中的其他主机不可见
      • 好的,你的主机是直接和DHCP服务器连接到同一个网络的,是不是从DHCP服务器分配的IP地址?另外,我假设您已将 --subnet--gateway 值更改为 DHCP 网络的值?
      • 是的,我确实改变了它们并且它连接到同一个网络。另一方面,IP 地址由 docker 处理,而不是 DHCP
      • 我的 virtualbox 来宾有 docker。我使用了启用了 dhcp 服务器的 virtualbox 虚拟以太网适配器。容器在 virtualbox 适配器中获得了相同子网值的 IP 地址,但无法 ping,因此它不是同一个子网。
      猜你喜欢
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2023-02-03
      • 2020-10-18
      • 2021-11-23
      • 1970-01-01
      • 2018-11-13
      • 2015-01-05
      相关资源
      最近更新 更多