Як отримати 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 є підштовхується мережевим менеджером (як пропонується в; askubuntu.com/a/545265/599087 автор «ліс»). osdir.com/ml/ubuntu-bugs/2016-10/msg05441.html
OpenITeX

Відповіді:


10

Найпростіший спосіб зробити це зараз:

lxc-info -n container-name -iH

Це повертає IP-адресу без іншого тексту.

У -iпараметр вказує , що IP - адреса має бути повернений і -Hопція відключає людини читаним вихід тобто етикетки. Для отримання додаткової інформації дивіться сторінку людини lxc-info .

EDIT для нової версії 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.
Стефано Палацо

FYI, на 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

Якщо дзвонити за допомогою сценарію, ви навіть 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 вашого хост-машини для запиту екземпляра 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

Відповідь проста

sudo lxc-ls -f | grep "container_name"

Якщо ви не пам'ятаєте ім'я контейнера, просто введіть sudo lxc-ls -f.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.