【发布时间】:2018-08-16 08:50:00
【问题描述】:
我有一台运行着多个虚拟机的服务器。我正在启动一个装有 Jira 的容器,我需要为容器分配与 DHCP 不同的地址,而不是使用主机 IP 地址。我是菜鸟,请解释一下
【问题讨论】:
-
您是在虚拟机中运行 docker 还是直接在主机服务器上运行?
-
直接在主机上。
标签: docker networking kvm
我有一台运行着多个虚拟机的服务器。我正在启动一个装有 Jira 的容器,我需要为容器分配与 DHCP 不同的地址,而不是使用主机 IP 地址。我是菜鸟,请解释一下
【问题讨论】:
标签: docker networking kvm
@ad22 的回答中建议的技术需要自定义构建使用 libnetwork 分支的 Docker 引擎。现在,在那个 hack 被开发四年多之后,DHCP 功能仍然没有被合并到标准的 Docker 引擎中,并且 fork 已经远远落后于主线代码。
自 2019 年底以来,可以使用devplayer0's docker-net-dhcp plugin 使用 DHCP 为 Docker 容器分配 IP 地址,这与标准 Docker 引擎配合使用。当您创建新容器时,此插件会启动 Busybox udhcpc 客户端以获取 DHCP 租约,然后运行 udhcpc(在容器的 PID 命名空间之外的进程中)以根据需要续订租约。
【讨论】:
正如在另一个答案中发现的那样,使用 macvlan 不会使容器能够从 DHCP 获取地址。从 DHCP 获取地址的功能是实验性的(这是由与 docker libnetwork 项目相关的人创建的)
https://gist.github.com/nerdalert/3d2b891d41e0fa8d688c
它建议将更改编译到 docker 二进制文件中然后运行
docker network create -d macvlan \
--ipam-driver=dhcp \
-o parent=eth0 \
--ipam-opt dhcp_interface=eth0 mcv0
由于这需要重新编译二进制文件,一个替代解决方案可能是 使用 docker run/compose 的“--ip”选项为所有容器分配静态 IP 地址,并获取分配给此 IP 的主机名的 DNS 条目,并确保永远不能通过 DHCP 分配 IP。
【讨论】:
您可以使用 docker network macvlan 驱动程序来实现这一点。根据docs:
...您可以使用 macvlan 网络驱动程序为每个容器的虚拟网络接口分配一个 MAC 地址,使其看起来是直接连接到物理网络的物理网络接口。
所以本质上,虚拟网络接口将使用主机上暴露的物理网络接口来通告它自己的虚拟 MAC 地址。然后这将被广播到运行 DHCP 服务器的 LAN,并且虚拟接口将被分配一个 IP。
实现它的步骤是:
创建一个使用 macvlan 驱动程序的 docker 网络:
docker network create \
--driver macvlan \
--subnet=172.16.86.0/24 \
--gateway=172.16.86.1 \
--opt parent=eth0 lan_net
子网和网关将是您的 LAN 网络(DHCP 所在的)的子网和网关。 parent 选项指定主机 上的物理接口,您希望通过该物理接口将虚拟接口暴露给 LAN 网络。
使用新创建的网络运行您的容器:
docker run -it --rm --net=lan_net alpine
【讨论】:
--subnet 和 --gateway 值更改为 DHCP 网络的值?