我有很多 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 dhclient
或dhclient
(未指定接口)。立即返回,但仍然没有 IP 或网络连接。
如何让 Docker 容器从与其主机相同的子网获取动态 IP,以便我可以跨多个主机部署容器而无需跟踪 IP?
额外信息
- 运行
DOCKER_OPTS="-e lxc"
/etc/default/docker
- 主机是Ubuntu 14.04
- Docker 容器是使用
from ubuntu:14.04
Dockerfile 构建的。
答案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 地址,只需执行以下操作:
- 在 docker daemon 命令上设置 dns 选项 (
--dns <my_dns_ip>
) - 打开
/etc/dhcp/dhclient.conf
并编辑包含request subnet-mask, broadcast-address...
并删除单词的行domain-name, domain-name-servers
- 然后应用后
service networking restart
您将获得一个新的 dhcp 地址,并且不会出现错误消息
答案4
另一种可能性是使用“管道”。您需要在容器外部运行它。https://github.com/jpetazzo/pipework