如何获取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。