Docker + 网桥 + DHCP

Docker + 网桥 + DHCP

我有很多 Docker 容器,需要在与其主机相同的 LAN 上进行寻址。到目前为止,我一直通过使用来实现这一点设置网桥并手动为其分配 IP,并自己管理 IP。一个启动示例如下:

docker run \
--net="none" \ \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.ipv4 = 192.168.1.3/24" \
--lxc-conf="lxc.network.ipv4.gateway = 192.168.1.254" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.name = eth0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]

主机在/etc/network/interfaces(ubuntu)中定义了桥,如下所示:

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.1.2
        netmask 255.255.255.0
        gateway 192.168.1.254
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

自从我发现农奴,我一直在尝试转向在容器内使用自动发现,以便 DHCP 可以跟踪 IP 并将其分发给容器。我后来将启动命令更改为:

docker run \
--net="none" \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]
/bin/bash

以及通往:

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

这导致容器启动,但没有 IP。然后我听取了建议在线帖子他成功地使用 Fedora 完成了这个任务,通过调用dhclient.不幸的是,这在基于 ubuntu 的容器中对我不起作用。

以下是我在不同条件下收到的错误消息:

  • dhclient当我启用--privileged启动容器时运行:

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • sudo dhclient eth0不在时运行--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • 正在运行sudo dhclientdhclient(未指定接口)。

    立即返回,但仍然没有 IP 或网络连接。

如何让 Docker 容器从与其主机相同的子网获取动态 IP,以便我可以跨多个主机部署容器而无需跟踪 IP?

额外信息

  • 运行DOCKER_OPTS="-e lxc"/etc/default/docker
  • 主机是Ubuntu 14.04
  • Docker 容器是使用from ubuntu:14.04Dockerfile 构建的。

答案1

看起来这是一个悬而未决的问题这是特定于 Ubuntu 容器和 Apparmor 的。

bprodoehl 在那里发布了一个解决方法:

  • 以特权方式启动容器--privileged
  • 将以下行添加到 dockerfile 中:RUN mv /sbin/dhclient /usr/sbin/dhclient
  • 运行dhclient eth0,您仍然会看到错误消息:mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busy,但您现在将拥有 IP 并且可以使用网络。

答案2

我找到了一个脚本

https://github.com/jkrauska/tech-notes/blob/master/docker-dhclient.md

这正是你想要的(程序员提到的解决方法)。

需要 mv 命令,因为当您在特权模式下运行 docker 容器时,docker 不会为容器定义 AppArmor 配置文件。因此,使用机器默认的 AppArmor 配置文件,它会阻止您在默认路径运行 dhclient。

答案3

如果您尝试在 ubuntu docker 容器上获取​​ dhcp 地址,只需执行以下操作:

  1. 在 docker daemon 命令上设置 dns 选项 ( --dns <my_dns_ip>)
  2. 打开/etc/dhcp/dhclient.conf并编辑包含request subnet-mask, broadcast-address...并删除单词的行domain-name, domain-name-servers
  3. 然后应用后service networking restart您将获得一个新的 dhcp 地址,并且不会出现错误消息

答案4

另一种可能性是使用“管道”。您需要在容器外部运行它。https://github.com/jpetazzo/pipework

相关内容