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

19

Я написал несколько сценариев для управления контейнерами LXC, и я могу получить их IP-адреса через ifconfig, при условии, что я подключен к консоли.

Теперь я хочу подключиться к этим контейнерам через SSH. Как мне получить их IP-адрес таким образом, чтобы я мог написать скрипт? Я также не хочу устанавливать адреса вручную (но я сделаю это, если это единственный вариант).

До сих пор я пытался использовать lxc-start, но машина не имеет IP-адрес, прежде чем я запустился /sbin/init.

Стефано Палаццо
источник
Та же проблема здесь, связанная с этим отчетом об ошибках, bugs.launchpad.net/ubuntu/+source/lxc/+bug/1389954, который содержит подтверждающую информацию о том, что это не работает в редакциях сервера Ubuntu 16.04, но работает нормально на рабочих столах, где dnsmasq запущен NetworkManager (как предложено в; askubuntu.com/a/545265/599087 от 'forest'). osdir.com/ml/ubuntu-bugs/2016-10/msg05441.html
OpenITeX

Ответы:

10

Самый простой способ сделать это сейчас:

lxc-info -n container-name -iH

Это возвращает IP-адрес без другого текста.

Параметр -iуказывает, что IP-адрес должен быть возвращен, а -Hпараметр отключает удобочитаемый вывод, то есть метки. Для получения дополнительной информации см. Справочную страницу lxc-info .

РЕДАКТИРОВАТЬ для более новой версии LXC:

lxc info container-name

Тогда вы получите подробную информацию. Посмотрите на блок «Ips:», который должен выглядеть так, как показано ниже. Вы могли бы получить первый адрес IPv4 ( 10.121.48.241) в этом случае:

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, мое следующее лучшее предложение - посмотреть на аренду 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
Оли
источник
Это работает отлично!
Стефано Палаццо
2
Для справки: новые версии LXC (т. Е. Та, что в Raring) показывают IP-адрес в выходных данных lxc-ls --fancy.
Стефано Палаццо
К вашему сведению, в 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-адрес.
Оли
К сожалению, я получаю такие же ошибки. No such file or directory - failed to open '/proc/28741/ns/pid'и failed to enter the namespace. Я нашел ошибку, которая точно описывает проблему, но это с 2010 года.
Стефано Палаццо
Мне пришлось использовать полный путь к ifconfig: lxc-attach -n container / sbin / ifconfig
Epeli
Как говорится в help.ubuntu.com/12.04/serverguide/lxc.html , lxc-attach не поддерживается.
ciastek
5

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

lxc-info -n $name -i

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

lxc-info -n $name -iH
vaab
источник
Если вы звоните через скрипт, вы даже lxc-info -n $name -Hiможете получить только IP без посторонних пробелов
Джулиан Х. Лам
4

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

dig @10.0.3.1 $container-name +short
Карл Хёрберг
источник
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, чтобы он работал без дальнейшего изучения.

cfalguiere
источник
1

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

lxc exec <container-name> -- ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
anastymous
источник
0

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

ramigg
источник
0

Пусть 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:~$
ʇsәɹoɈ
источник
0

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

sudo lxc-ls -f | grep "container_name"

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

user646873
источник