
Хорошо, я хочу узнать, как организовать сетевое взаимодействие в контейнерах LXC. Не просто какую-то расплывчатую информацию, которую вы получаете с других сайтов, а настоящее руководство для новичков по тому, как заставить их работать. Поскольку большинство примеров в основном настраиваются для людей, чтобы они могли их тестировать, я хочу запустить службу на одном из них... например, веб-сервер.
Я использую Ubuntu 12.04 LTS, у меня установлен LXC, и я могу создавать, запускать и останавливать контейнер. У моего сервера, очевидно, есть публичный IP, и я хотел бы узнать, как настроить контейнер так, чтобы он тоже мог иметь публичный IP. Поскольку, похоже, мост из моего текущего контейнера уже есть, мне, похоже, нужно либо предоставить контейнерам диапазон DHCP, который будет публичным для их работы, либо вручную назначить статический IP-адрес моему контейнеру.
Если я хочу статически назначить IP-адрес контейнеру, как это сделать? Нужно ли мне вносить какие-либо изменения в конфигурацию моста на хосте? Лучше ли это сделать с опцией MACVLAN?
Любая помощь будет оценена по достоинству.
решение1
Мой подход предполагает, что на вашем сервере есть одна сетевая карта, и вам нужно разделить эту сетевую карту между хостом и гостями LXC. Это подразумевает использование моста. Мост владеет и управляет eth0
. Хост теперь настраивает свою собственную сеть br0
вместо eth0
. Гости LXC настроены на подключение к мосту.
На хосте
sudo apt-get install bridge-utils
.На хосте замените
eth0
на мост:Это опасно. Если вы сделаете это неправильно, то можете оказаться запертыми в вашем сервере. Убедитесь, что у вас включен локальный вход и работает доступ к локальной консоли, чтобы вы могли отменить это изменение, если у вас возникнут какие-либо проблемы.
В
/etc/network/interfaces
:- Заменить .
auto eth0
auto br0
Заменять:
iface eth0 inet dhcp
с:
iface br0 inet dhcp bridge_ports eth0
Если у вас статическая конфигурация сети, то вам следует заменить:
iface eth0 inet static address ... netmask ... gateway ... etc.
с:
iface br0 inet static bridge_ports eth0 address ... netmask ... gateway ... etc.
Вы просто меняете
eth0
иbr0
добавляетеbridge_ports eth0
строку.Перезагрузите хост. Если вы делали это локально, то запуск
sudo ifdown eth0
перед началом иsudo ifup br0
после тоже подойдет. Обратите внимание, что мосту может потребоваться некоторое время для запуска, поэтому дайте ему пять минут после перезагрузки, прежде чем вы решите, что все потеряно.
- Заменить .
Чтобы переместить указанный именованный контейнер LXC на публичный IP-адрес:
- Остановите контейнер.
- На хосте отредактируйте и измените на .
/var/lib/lxc/container_name/config
lxc.network.link
br0
- На хосте отредактируйте и настройте свой публичный IP, как обычно (DHCP или статическая конфигурация по мере необходимости). Обратите внимание, что интерфейс по-прежнему вызывается с точки зрения контейнера.
/var/lib/lxc/container_name/rootfs/etc/network/interfaces
eth0
- Перезапустите контейнер.
Чтобы изменить значение по умолчанию для новых контейнеров LXC, отредактируйте файл
/etc/lxc/default.conf
на хосте и изменитеlxc.network.link
его наbr0
.Если вам вообще не нужен мост NAT, предоставляемый LXC (т. е. все ваши контейнеры будут использовать новый мост), то на хосте отредактируйте
/etc/default/lxc
и изменитеUSE_LXC_BRIDGE
на"false"
, а затем на хосте запуститеsudo service lxc restart
.
решение2
Роби, большое спасибо за публикацию этого ответа. Я из кожи вон лез, пытаясь это сделать, и это единственный метод, который сработал!
Я подумал, что стоит упомянуть несколько вещей, которые я выяснил, чтобы помочь прояснить инструкции для других администраторов.
На моем хосте было назначено несколько статических IP-псевдонимов для eth0 на гостевой машине, например:
iface eth0:1 inet static
address 5.5.5.5
netmask 255.255.255.5
gateway 5.5.5.1
etc.
Теперь мы не хотим настраивать br0 таким же образом, нам просто нужен один IP без псевдонимов, как у Роби, указанного выше.
Допустим, вы хотите назначить 5.5.5.5 контейнеру debian8.
Редактировать /var/lib/lxc/debian8/etc/network/interfaces
и добавить:
iface eth0 inet static
address 5.5.5.5
netmask 255.255.255.5
gateway 5.5.5.1
etc.
Затем введите следующую команду:route add default gw <gateway-ip, in my case 5.5.5.1>
После этого перезагрузите контейнер и все должно наконец заработать! :)
решение3
У меня была та же проблема, и у меня есть это решение (быстрое и грубое).
server: eth0 = 10.1.0.77/24
server: lxdbr0 (lxd bridge) = 10.255.255.77/24
container: eth0 = 10.255.255.100/24 (same network as lxdbr0)
container: eth0:0 = 194.99.99.99/28 (public ip address on eth0 alias)
На сервере:route add -host 194.99.99.99 gw 10.255.255.100 dev lxdbr0
Также при необходимости добавьте маршрут к вышестоящим маршрутизаторам.
Возможно, это не лучшее решение, но оно не требует больших усилий! Ура.