我已经编写了一些脚本来管理LXC容器,并且假设我已连接到控制台,则可以通过ifconfig获取其IP地址。
我现在想通过ssh连接到这些容器。如何以一种可以编写脚本的方式获取他们的IP地址?我也不想手动设置地址(但是,如果那是唯一的选择,我会做的)。
到目前为止,我已经尝试使用lxc-start
,但是在运行之前,该机器没有IP地址/sbin/init
。
我已经编写了一些脚本来管理LXC容器,并且假设我已连接到控制台,则可以通过ifconfig获取其IP地址。
我现在想通过ssh连接到这些容器。如何以一种可以编写脚本的方式获取他们的IP地址?我也不想手动设置地址(但是,如果那是唯一的选择,我会做的)。
到目前为止,我已经尝试使用lxc-start
,但是在运行之前,该机器没有IP地址/sbin/init
。
Answers:
现在最简单的方法是:
lxc-info -n container-name -iH
这将返回IP地址,没有其他文本。
该-i
选项指定应返回IP地址,并且该-H
选项禁用人类可读的输出,即标签。有关更多信息,请参见lxc-info 手册页。
编辑LXC的较新版本:
lxc info container-name
然后,您将获得详细信息。查看“ Ips:”块,其外观应类似于以下内容。10.121.48.241
在这种情况下,您可以获取第一个IPv4地址():
Ips:
eth0: inet 10.121.48.241 vethSBP4RR
eth0: inet6 fda5:b9a9:f3b9:ba32:216:3eff:fe4a:4d7d vethSBP4RR
eth0: inet6 fe80::216:3eff:fe4a:4d7d vethSBP4RR
lo: inet 127.0.0.1
lo: inet6 ::1
鉴于在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-ls --fancy
。
dnsmasq.lxcbr0.leases
从技术上讲,您应该能够使用lxc-attach
命令进行连接和触发(并处理输出),如下所示:
sudo lxc-attach --name containername -- ifconfig
这要求容器正在运行。
注意:我无法执行此操作。我安装了LXC并尝试了此操作,但看到大量的名称空间错误,文件丢失和其他废话。但是我对LXC的唯一经验是我花了10分钟来解决这个问题。它可能会起作用。可能不会。祝好运!
ifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2
如果只需要IP地址,则将其升级到。
No such file or directory - failed to open '/proc/28741/ns/pid'
和failed to enter the namespace
。我发现了一个准确描述问题的错误,但这是从2010
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
以下命令替换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文档提供的预定义配置模板,使其无需进一步研究即可工作。
让dnsmasq为您做。
配置主机的dnsmasq实例,以查询.xxc顶级域的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容器或使它们请求新的DHCP租约,然后它们才出现在DNS中。(我不记得在执行此操作时是否必要。)还值得一提的是,我看到了一个有关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:~$