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


19

我已经编写了一些脚本来管理LXC容器,并且假设我已连接到控制台,则可以通过ifconfig获取其IP地址。

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

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


与此错误报告相关的此处相同的问题是bugs.launchpad.net/ubuntu/+source/lxc/+bug/1389954,其中包含与此相关的确证信息,不适用于Ubuntu 16.04 Server Edtions,但在dnsmasq所在的台式机中可以由NetworkManager 发起(如建议;askubuntu.com/a/545265/599087,由“ forest”提供)。osdir.com/ml/ubuntu-bugs/2016-10/msg05441.html
OpenITeX 2016年

Answers:


10

现在最简单的方法是:

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

使用LXD和非特权容器时,此命令无效。您如何通过LXD在2017年推广的默认未特权容器获得该信息?
jgomo3

10

鉴于在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

很好用!
Stefano Palazzo

2
供参考:LXC的新版本(即Raring中的版本)在的输出中显示IP地址lxc-ls --fancy
Stefano Palazzo

仅供参考,在Ubuntu上,此IP租约记录的文件名包含lxc网桥名称,例如dnsmasq.lxcbr0.leases
Flint

7

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

sudo lxc-attach --name containername -- ifconfig

这要求容器正在运行。

注意:我无法执行此操作。我安装了LXC并尝试了此操作,但看到大量的名称空间错误,文件丢失和其他废话。但是我对LXC的唯一经验是我花了10分钟来解决这个问题。它可能会起作用。可能不会。祝好运!


当然,ifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2如果只需要IP地址,则将其升级到。
奥利(Oli)

不幸的是,我遇到了同样的错误。No such file or directory - failed to open '/proc/28741/ns/pid'failed to enter the namespace。我发现了一个准确描述问题的错误,但这是从2010
。– Stefano Palazzo

我必须使用ifconfig的完整路径:lxc-attach -n container / sbin / ifconfig
Epeli 2013年


5

这适用于Ubuntu 14.04:

lxc-info -n $name -i

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

lxc-info -n $name -iH

如果通过脚本调用,您甚至lxc-info -n $name -Hi可以只获取没有多余空格的IP
朱利安·林


2

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

1

以下命令替换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文档提供的预定义配置模板,使其无需进一步研究即可工作。


1

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

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


0

让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:~$

0

简单的答案是

sudo lxc-ls -f | grep "container_name"

如果您不记得容器名称,只需键入sudo lxc-ls -f。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.