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

17

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

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

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

    
задан Stefano Palazzo 18.03.2013 в 17:41
источник

11 ответов

8

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

lxc-info -n container-name -iH

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

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

ответ дан Andy 14.05.2015 в 15:02
источник
10

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

$ cat /var/lib/misc/dnsmasq.leases
1363699477 00:16:3e:4a:ce:a4 10.0.3.83 containername *

Есть только две части, которые могут быть использованы, поэтому мы можем отформатировать их намного лучше:

$ awk '{ print , }' /var/lib/misc/dnsmasq.leases | column -t
containername  10.0.3.83
    
ответ дан Oli 19.03.2013 в 14:03
6

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

sudo lxc-attach --name containername -- ifconfig

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

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

    
ответ дан Oli 18.03.2013 в 18:21
4

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

dig @10.0.3.1 $container-name +short
    
ответ дан Carl Hörberg 21.08.2013 в 13:12
4

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

lxc-info -n $name -i

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

lxc-info -n $name -iH
    
ответ дан vaab 11.04.2014 в 13:07
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 31.01.2014 в 18:29
1

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

lxc exec <container-name> -- ip addr show eth0 | grep "inet\b" | awk '{print }' | cut -d/ -f1
    
ответ дан anastymous 14.07.2016 в 02:09
0

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

ответ дан ramigg 05.05.2014 в 14:16
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 [email protected]
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-39-generic x86_64)
[email protected]:~$
    
ответ дан ʇsәɹoɈ 03.11.2014 в 21:17
0

Версия 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
    
ответ дан Ektor 04.11.2016 в 11:55
0

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

sudo lxc-ls -f | grep "container_name"

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

    
ответ дан user646873 26.01.2017 в 08:12