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

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

多年来,我做过一些 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 |
+-------+---------+------------------+------+------------+-----------+

太棒了。不过我似乎无法控制这里的 IP 地址。我找到了一个控制文件(借助 Google 和locate):

>> root@ubuntu:/# locate lxc.conf 
/etc/init/lxc.conf 
..
/var/log/lxd/thing/lxc.conf

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

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

答案1

这些配置将放在文件中/var/lib/lxc/ContainerName/config。参数的可能值指定为在手册中。它们属于不同的领域,主机名、网络、控制台、ttys、挂载点、cgroups、功能……

在网络下,您将找到所需的一切。对于未指定的变量,会自动生成合理的值。与您的问题最相关的部分如下:

lxc.网络.名称

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

lxc.network.hwaddr

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

lxc.网络.ipv4

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

lxc.网络.ipv4.网关

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

答案2

我找到了解决方案这里

感谢 Stéphane Graber。

引用:

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

  • lxc 停止 c1
  • lxc 网络连接 lxdbr0 c1 eth0 eth0
  • lxc 配置设备设置 c1 eth0 ipv4.地址 10.99.10.42
  • lxc 启动 c1

答案3

如果您想在 LXD 中为容器指定 IP 地址,请查看该/etc/default/lxd-bridge文件。您将在那里找到一个包含外部 dnsmasq 配置文件的位置。

假设你使用的是 Ubuntu 16.04,

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

在第 16 行左右,

LXD_CONFILE=""

添加指向 dnsmasq 配置文件的条目。您必须创建此文件。因此,您可以随意命名它。例如lxd_bridge.conf

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

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

像这样:

dhcp-host=containername,ipaddress

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

以下是关于此问题的详细文章:

LXD 静态 IP

请注意,如果您在容器中运行 Alpine Linux,则需要采取其他步骤才能使其正常工作。 高山

答案4

对于仍然在努力如何为 lxd 容器分配静态 IP 地址的人来说。

我第一次尝试通过 dnsmasq 进行操作,因此我添加了容器的 IP 地址/var/lib/lxd/networks/lxdbr0/dnsmasq.hosts/<container>并重新加载了 dnsmasq 服务。它确实有效,但在重新启动主机后没有持续存在。

我认为应该可以使用 lxd 工具来实现这一点。事实上,在lcd-文档。我真的不知道如何配置密钥用户网络配置使用命令lxc config set <container> user.network-config <value>。由于我无法注入多个键:值在价值论证中。

  1. 检查容器子网

    lxc network show lxdbr0
    
  2. 首先创建一个 yml(network.yml)文件,其值如下

    version: 1
    config:
      - type: physical
        name: eth1
        subnets:
          - type: static
            ipv4: true
            address: <ip>
            netmask: 255.255.255.0
            gateway: <gateway> // ends often with .1
            control: auto
      - type: nameserver
        address: 8.8.8.8       // for example
    
  3. 使用此网络配置创建容器

    lxc launch ubuntu:18.04 test --config=user.network-config="$(cat network.yml)"    
    

瞧 :)

我尝试在创建容器后更改 IP 地址

   lxc config set <container> user.network-config "$(cat network.yml)"

我重启了容器,但 IP 没有更新。如果有人知道如何在创建容器后让它工作,我将不胜感激。

lxd 版本 3.0.1

相关内容