Docker +网桥+ DHCP


13

我有很多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

自从发现serf以来,我一直在尝试着在容器内使用自动发现,以便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构建的。

Answers:


3

看来这是一个未解决的问题,并且特定于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,就可以使用网络了。

对于我的案子来说,它就像是一种魅力,但是为什么需要MV呢?你能解释一下吗?
Federico Bonelli 2014年

那就是那个人发布的解决方案(我链接到该解决方案)中的内容,并且似乎可以正常工作。也许其他人可以解释。
Programster

1
@Federico Bonelli:Apparmor将安全限制应用于其管理的应用程序。它仅管理具有策略定义的应用程序。这些策略根据其路径匹配应用程序。当您dhclient/sbin移到/usr/sbinApparmor时,策略定义将不再匹配,并且Apparmor将不会对此“未知”应用程序应用任何安全限制。
辣椒粉

我不得不求助于“ sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient”,因为解决方法不是这样,这是一个Ubuntu 14.04容器。但是,看到了以上错误消息,然后分配了IP地址。
尼尔·麦吉尔


1

如果您尝试在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地址,而不会出现错误消息

-2

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


5
嗨,欢迎来到该网站。我们希望答案在这里更加全面。您能编辑并解释一下它pipework是什么,在哪里可以找到它,如何安装它,也许可以举例说明它的用法?就目前而言,您的答案是评论,而不是答案。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.