Как получить IP-адрес контейнера LXC?

Я думаю, что философия, лежащая в основе nautilus, заключается в том, что она должна быть плоской, простой и короткой

1
задан 18 March 2013 в 22:41

10 ответов

Увидев, что работа в контейнерах не поддерживается в Ubuntu, мое следующее лучшее предложение - посмотреть на аренду IP-адресов, которые выдает dnsmasq. Это очень просто:

$ 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
10
ответ дан 25 May 2018 в 00:24
  • 1
    Это работает отлично! – Stefano Palazzo♦ 20 March 2013 в 21:12
  • 2
    Для справки: новые версии LXC (то есть в Raring) показывают IP-адрес на выходе lxc-ls --fancy. – Stefano Palazzo♦ 9 September 2013 в 18:19
  • 3
    FYI, на Ubuntu имя файла этой записи аренды IP содержит имя моста lxc, например dnsmasq.lxcbr0.leases – Flint 5 May 2014 в 18:16

С технической точки зрения вы должны иметь возможность использовать lxc-attach для подключения и запускать команду (и обрабатывать вывод) следующим образом:

sudo lxc-attach --name containername -- ifconfig

Для этого требуется, чтобы контейнер работал. [ ! d1]

Примечание: я не мог заставить это работать. Я установил LXC и попробовал это, но просто увидел пробел ошибок пространства имен, отсутствующих файлов и других глупостей. Но мой единственный опыт работы с LXC - это 10 минут, которые я потратил на этот вопрос. Это может сработать. Возможно, это не так. Удачи!

6
ответ дан 25 May 2018 в 00:24
  • 1
    И, конечно, обновите это до ifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2, если вам нужен только IP-адрес. – Oli♦ 18 March 2013 в 23:33
  • 2
    К сожалению, я получаю такие же ошибки. No such file or directory - failed to open '/proc/28741/ns/pid' и failed to enter the namespace. Я нашел ошибку , которая точно описывает проблему, но это с 2010 года. – Stefano Palazzo♦ 19 March 2013 в 14:11
  • 3
    Мне пришлось использовать полный путь к ifconfig: lxc-attach -n container / sbin / ifconfig – Epeli 19 October 2013 в 13:58
  • 4
    Как help.ubuntu.com/12.04/serverguide/lxc.html говорит, что lxc-attach не поддерживается. – ciastek 22 January 2014 в 07:17

Или запрос dnsmasq (который дает IP-адреса контейнерам)

dig @10.0.3.1 $container-name +short
4
ответ дан 25 May 2018 в 00:24

Это работает на Ubuntu 14.04:

lxc-info -n $name -i

, и если вам нужен только IP-адрес (полезен для скриптов), (спасибо @JulianHLam):

lxc-info -n $name -iH
4
ответ дан 25 May 2018 в 00:24
  • 1
    Если вы звоните через скрипт, вы можете даже сделать lxc-info -n $name -Hi, чтобы получить только IP без посторонних пробелов – Julian H. Lam 1 April 2015 в 21:50

Команда ниже заменяет пример 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
ответ дан 25 May 2018 в 00:24

Если вы используете LXD, вы можете найти эту команду полезной для получения IP-адреса работающего контейнера

lxc exec <container-name> -- ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
1
ответ дан 25 May 2018 в 00:24

Версия 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
ответ дан 25 May 2018 в 00:24
sudo lxc-ls --fancy -F ipv4 $my_container_name | tail -1

0
ответ дан 25 May 2018 в 00:24

Пусть dnsmasq сделает это за вас.

Настройте экземпляр dnsmasq вашего хоста, чтобы запросить экземпляр dnsmasq lxc для домена верхнего уровня .lxc.

В / 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
ответ дан 25 May 2018 в 00:24

Простой ответ:

sudo lxc-ls -f | grep "container_name"

Если вы не помните имя_контента, просто введите sudo lxc-ls -f.

0
ответ дан 25 May 2018 в 00:24

Другие вопросы по тегам:

Похожие вопросы: