Я написал несколько сценариев для управления контейнерами LXC, и я могу получить их IP-адреса через ifconfig, при условии, что я подключен к консоли.
Теперь я хочу подключиться к этим контейнерам через ssh. Как мне получить их IP-адрес таким образом, чтобы я мог написать скрипт? Я также не хочу устанавливать адреса вручную (но я сделаю это, если это единственный вариант).
До сих пор я пытался использовать lxc-start
, но машина не имеет IP-адреса до того, как я запустил /sbin/init
.
С технической точки зрения необходимо смочь использовать lxc-attach
соединяться и стрелять в команду (и обработать вывод), как так:
sudo lxc-attach --name containername -- ifconfig
Это требует, чтобы контейнер работал.
Примечание: Я не мог заставить это работать. Я установил LXC и попробовал это, но просто видел шумы ошибок пространства имен, недостающих файлов и другой ерунды. Но мой единственный опыт с LXC составляет эти 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
Версия 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
Поскольку 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
Или запрос dnsmasq (который дает IP-адреса для контейнеров)
dig @10.0.3.1 $container-name +short
Это работает в Ubuntu 14.04:
lxc-info -n $name -i
и, если вам нужен только IP-адрес (полезно для скриптов), (спасибо @JulianHLam):
lxc-info -n $name -iH
Если вы используете LXD, эта команда может оказаться полезной для получения IP-адреса работающего контейнера
lxc exec <container-name> -- ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
Команда ниже заменяет пример 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, чтобы он работал без дальнейшего изучения.
sudo lxc-ls --fancy -F ipv4 $my_container_name | tail -1
Простой ответ:
sudo lxc-ls -f | grep "container_name"
Если вы не помните имя контейнера, просто введите sudo lxc-ls -f.
Пусть 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- Вместо этого доступно / 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:~$