Контейнерная LXC виртуализация прекрасно работает в Ubuntu 12.04, но у неё есть серьезный недостаток: если контейнеру назначен статический IP адрес, через конфигурационный файл, то по имени данный контейнер не ресолвится в DNS даже в частной сети которая создается по умолчанию. Правка файла /etc/hosts на основной машине ситуацию не исправляет.
Можно конечно поднять отдельный DNS сервер или использовать имеющийся в настоящей локальной сети, но это может быть не применимым или слишком тяжеловесным решением в некоторых ситуация, например на девелоперской машине.
К счастью, проблема исправляется посредством правки файла /etc/init/lxc-net.conf. Вот последовательность шагов, который позволят вам настроить корректное разрешение DNS имени:
- Создайте файл, по формату аналогичный /etc/hosts и заполните его информацией по IP адресам и доменным именам контейнеров. Далее я буду считать что вы сохранили этот файл как /var/lib/lxc/hosts хотя никто не мешает разместить его в другом месте
- От имени root'а откройте на редактирование файл /etc/init/lxc-net.conf и найдите строчку в которой производится старт dnsmasq. Её начало выглядит вот так:
dnsmasq -u lxc-dnsmasq --strict-order... - В конце этой строчки, прямо перед || cleanup добавьте
--addn-hosts=/var/lib/lxc/hosts. - В результате правки вся строка будет выглядеть вот так:
dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=${varrun}/dnsmasq.pid --conf-file= --listen-address ${LXC_ADDR} --dhcp-range ${LXC_DHCP_RANGE} --dhcp-lease-max=${LXC_DHCP_MAX} --dhcp-no-override --except-interface=lo --interface=${LXC_BRIDGE} --dhcp-option=119,${LXC_DOMAIN_SEARCH} --dhcp-option=6,${LXC_DNS_SERVER} --addn-hosts=/var/lib/lxc/hosts|| cleanup - Сохранив изменения произведите остановку и запуск сервиса lxc-net:
sudo service lxc-net stop; sudo service lxc-net start
Если часть ваших контейнеров получает IP адрес через dhcp и вы также хотите предоставить им возможность обращаться к контейнерам со статическими адресами по имени, убедитесь что переменная LXC_DNS_SERVER содержит адрес вашей машины с запущенными lxc контейнерами, а не адрес DNS сервера реальной локальной сети. Эту переменную можно исправить непосредственно в /etc/init/lxc-net, но лучше это сделать в /etc/default/lxc
Данной решение имеет один недостаток: здесь мы правим системный init скрипт, который потенциально может быть обновлен при получении в процессе обновления новой версии пакета lxc. В таком случае придется слить наши локальный правки с изменениями файла из пакета.
Данной решение имеет один недостаток: здесь мы правим системный init скрипт, который потенциально может быть обновлен при получении в процессе обновления новой версии пакета lxc. В таком случае придется слить наши локальный правки с изменениями файла из пакета.