LXD 容器和具有静态 IP 的网络

Wil*_*lem 7 networking linux ubuntu lxc

多年来,我已经进行了一些 Docker 测试,但是对于特定类型的测试,我需要的不仅仅是应用程序容器。所以我转向 LXC/LXD 容器,这很棒。安装 LXD 后,我创建了自己的容器:

>> willem@ubuntu:/$ lxc launch images:centos/7/amd64 thing Creating thing
Starting thing 
>> willem@ubuntu:/$ lxc list
+-------+---------+------------------+------+------------+-----------+ 
| NAME  |  STATE  |       IPV4       | IPV6 |    TYPE    | SNAPSHOTS |
+-------+---------+------------------+------+------------+-----------+ 
| thing | RUNNING | 10.0.3.30 (eth0) |      | PERSISTENT |         0 |
+-------+---------+------------------+------+------------+-----------+
Run Code Online (Sandbox Code Playgroud)

伟大的。只有我似乎对这里的 IP 地址没有任何控制权。我找到了(在 Google 的帮助下并找到了)一个控制文件:

>> root@ubuntu:/# locate lxc.conf 
/etc/init/lxc.conf 
..
/var/log/lxd/thing/lxc.conf
Run Code Online (Sandbox Code Playgroud)

您可以在其中放置(看起来像)静态 IP4 地址。只有在重新启动容器时,主机似乎忘记了我的静态 IP,并从 DHCP 中获取了一个。问题:

  • 这样做的正确方法是什么(我的意思是,最新的 Docker 有一个设置 IP 地址的--ip开关docker run)?

小智 7

我在这里找到了解决方案

感谢 Stéphane Graber。

引用:

“如果运行带有 LXD 托管网桥的现代 LXD,那么您只需在容器的网络接口上设置 ipv4.address 属性即可。

  • lxc停止c1
  • lxc 网络连接 lxdbr0 c1 eth0 eth0
  • lxc 配置设备集 c1 eth0 ipv4.address 10.99.10.42
  • lxc 开始 c1


小智 5

如果要为 LXD 中的容器指定 ip 地址,请查看该/etc/default/lxd-bridge文件。在那里你会发现一个包含外部 dnsmasq 配置文件的地方。

假设您使用的是 Ubuntu 16.04,

/etc/default/lxd-bridge在您最喜欢的编辑器中打开。您将需要使用sudo.

在 16 号线附近,

LXD_CONFILE=""
Run Code Online (Sandbox Code Playgroud)

添加指向 dnsmasq 配置文件的条目。您将不得不创建此文件。所以随便命名吧。类似的东西lxd_bridge.conf

然后创建并编辑您在上面命名的文件。

为要为其分配特定 IP 地址的每个容器添加一行。

像这样:

dhcp-host=containername,ipaddress
Run Code Online (Sandbox Code Playgroud)

然后您需要重新启动 lxd-bridge,然后重新启动容器。

这是一篇关于此的详细文章:

LXD 静态 IP

请注意,如果您在容器中运行 Alpine linux,则需要采取额外的步骤来完成这项工作。 高山


Moh*_*dji 5

系统信息:lxc-3.0.1Ubuntu Server 18.04.1

经过大量搜索,我发现这个简单的命令可以为容器分配静态IP:

lxc config set [container] raw.lxc 'lxc.net.[i].ipv4.address = [ip]/[subnet-mask]'
Run Code Online (Sandbox Code Playgroud)

其中[container][i][ip][subnet-mask]分别是容器名称、网络接口号、所需的静态 IP 地址和所需子网掩码的 CIDR。

例如,如果您想为名为 的容器的第 0 个网络接口240.10.0.20分配子网掩码,您可以使用:255.255.255.0hello

lxc config set hello raw.lxc 'lxc.net.0.ipv4.address = 240.10.0.20/24'
Run Code Online (Sandbox Code Playgroud)

执行命令后您可能需要重新启动容器。

请注意,这可能不会更改容器的当前 IP 地址(无论如何在我的设置中);容器应可通过其原始 IP 和新分配的 IP 访问。因此,容器条目lxc list可能包含多个 IP 地址。

请在此处查看可附加到 的可接受的配置键lxc.net.[i]。此网页包含有关 CIDR 表示法的信息。

不幸的是,我不记得我第一次找到这个解决方案的地方。这是一个相关的GitHub 问题,可能包含有用的信息。


Mar*_*iae 3

这些配置将被放置在文件中/var/lib/lxc/ContainerName/config手册中指定了参数的可能值。它们涉及不同的区域,主机名,网络,控制台,ttys,挂载点,cgroups,功能,...

在网络下,您将找到您所需要的一切。系统会自动为未指定的变量生成敏感值。与您的问题最相关的部分如下:

lxc.网络名称

接口名称是动态分配的,但如果由于容器使用的配置文件使用通用名称而需要另一个名称,例如 eth0,该选项将重命名容器中的接口。

lxc.network.hwaddr

默认情况下,接口 MAC 地址是动态分配给虚拟接口的,但在某些情况下,需要这样做来解决 MAC 地址冲突或始终具有相同的链路本地 ipv6 地址

lxc.network.ipv4

指定要分配给虚拟化接口的 ipv4 地址。多行指定多个 ipv4 地址。地址的格式为 xyzt/m,例如。192.168.1.123/24。广播地址应指定在同一行中,紧接在 ipv4 地址之后。

lxc.network.ipv4.网关

指定用作容器内网关的 ipv4 地址。地址的格式为 xyzt,例如。192.168.1.123。还可以具有特殊值 auto,这意味着从桥接口获取主地址(由 lxc.network.link 选项指定)并将其用作网关。auto 仅在使用 veth 和 macvlan 网络类型时可用。