Dhcp

碼頭工人 + 橋 + DHCP

  • May 10, 2016

我有很多 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。然後,我從一個線上文章中獲得了建議,該文章通過致電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 建構的。

看來這是一個懸而未決的問題,並且這是特定於 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,你可以使用網路了。

我找到了一個腳本

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

這正是您想要的(Programster 提到的解決方法)。

需要 mv 命令,因為當您在特權模式下執行 docker 容器時,docker 不會為容器定義 AppArmor 配置文件。因此使用機器預設 AppArmor 配置文件,它會阻止您在其預設路徑上執行 dhclient。

引用自:https://unix.stackexchange.com/questions/155990