如何获取LXC容器的IP地址?

我写了几个脚本来管理LXC容器,我可以通过ifconfig获取他们的IP地址,假设我已连接到控制台。

我现在想通过ssh连接到这些容器。 如何以我可以编写脚本的方式获取其IP地址? 我也不想手动设置地址(但我会这样做,如果这是唯一的选择)。

到目前为止,我已尝试使用lxc-start ,但在运行/sbin/init之前,机器没有IP地址。

现在最简单的方法是:

 lxc-info -n container-name -iH 

这将返回没有其他文本的IP地址。

-i选项指定应返回IP地址, -H选项禁用人类可读输出,即标签。 有关更多信息,请参阅lxc-info 手册页 。

在Ubuntu中似乎不支持在容器中运行东西,我的下一个最佳建议是查看dnsmasq正在分发的IP地址租约。 这很简单:

 $ cat /var/lib/misc/dnsmasq.leases 1363699477 00:16:3e:4a:ce:a4 10.0.3.83 containername * 

那里只有两个部分是有用的,所以我们可以格式化得更好:

 $ awk '{ print $4,$3 }' /var/lib/misc/dnsmasq.leases | column -t containername 10.0.3.83 

从技术上讲,您应该能够使用lxc-attach连接并触发命令(并处理输出),如下所示:

 sudo lxc-attach --name containername -- ifconfig 

这需要容器运行。

注意:我无法让它工作。 我安装了LXC并尝试了这个,但只看到了一些命名空间错误,丢失文件和其他废话。 但我对LXC的唯一体验是我在这个问题上花了10分钟。 它可能会奏效。 它可能不会。 祝好运!

这适用于Ubuntu 14.04:

 lxc-info -n $name -i 

如果你只想要IP地址(对脚本很有用),(感谢@JulianHLam):

 lxc-info -n $name -iH 

或者查询dnsmasq(它为容器提供IP)

 dig @10.0.3.1 $container-name +short 

以下命令替换了上lxc-attach文章中的lxc-attach示例

 sudo lxc-execute --name containername --rcfile /usr/share/doc/lxc/examples/lxc-macvlan.conf /sbin/ifconfig 

它在容器内运行ifconfig并显示输出。

 The --rcfile argument might not be required. Without it the command failed with lxc-execute: No such file or directory - failed to exec /usr/lib/lxc/lxc-init lxc-execute: invalid sequence number 1. expected 2 

听起来好像没有正确配置。 作为一种解决方法,我使用了LXC文档提供的预定义配置模板,使其无需进一步调查即可运行。

如果您正在运行LXD,您可能会发现此命令对于获取正在运行的容器的IP地址非常有用

 lxc exec  -- ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1 

Python版本:

 #!/usr/bin/python from pylxd import Client client = Client(endpoint='https://10.185.96.208:8443', verify=False, cert=('.config/lxc/client.crt', '.config/lxc/client.key')) myCtr = client.containers.get('YOUR_CTR_NAME') addresses = myCtr.state().network['eth0']['addresses'] for a in addresses: if(a['scope'] == 'global'): print "Found IP [%s]" %(a['address']) break 

sudo lxc-ls --fancy -F ipv4 $my_container_name | tail -1

让dnsmasq为你做。

配置主机的dnsmasq实例以查询lxc的.lxc顶级域的dnsmasq实例。

在/ etc / default / lxc-net中,取消注释此行:

 LXC_DOMAIN="lxc" 

如果您的主机的dnsmasq实例由NetworkManager启动(与大多数当前Ubuntu桌面安装的情况一样),请创建一个名为/etc/NetworkManager/dnsmasq.d/lxc.conf的文件,其中包含以下内容:

 server=/lxc/10.0.3.1 

如果您的主机的dnsmasq是由NetworkManager以外的其他东西启动的,请将该行添加到/etc/dnsmasq.d-available/lxc:

 server=/lxc/10.0.3.1 

然后重新启动,以便他们获取更改:

 service lxc-net stop service lxc-net start service network-manager restart 

您可能必须重新启动lxc容器,或者让它们在DNS出现之前请求新的DHCP租约。 (我不记得在我这样做的时候是否有必要。)还值得一提的是,我看到一个关于lxc-net在重启时没有获取dnsmasq更改的错误报告,因此您可能只想重新启动主机系统为了确定。

然后尝试一下:

 $ host mycontainer.lxc mycontainer.lxc has address 10.0.3.21 $ ssh ubuntu@mycontainer.lxc Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-39-generic x86_64) ubuntu@mycontainer:~$ 

简单的答案是

 sudo lxc-ls -f | grep "container_name" 

如果你不记得container_name,只需输入sudo lxc-ls -f。