多年来,我做过一些 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,然后重新启动容器。
以下是关于此问题的详细文章:
请注意,如果您在容器中运行 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>
。由于我无法注入多个键:值在价值论证中。
检查容器子网
lxc network show lxdbr0
首先创建一个 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
使用此网络配置创建容器
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