Dhcp
碼頭工人 + 橋 + 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
自從我發現了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 dhclient
或dhclient
(未指定介面)。立即返回,仍然沒有 IP 或網路連接。
如何讓 docker 容器從與其主機相同的子網中獲取動態 IP,這樣我就可以在多個主機上部署容器而不跟踪 IP?
額外資訊
- 跑
DOCKER_OPTS="-e lxc"
進去/etc/default/docker
- 主機是 Ubuntu 14.04
- Docker 容器是使用
from ubuntu:14.04
Dockerfile 建構的。
看來這是一個懸而未決的問題,並且這是特定於 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。