6

За прошедшие годы я провел некоторое тестирование Docker, но для определенного вида тестирования мне нужно немного больше, чем просто контейнеры приложений. Поэтому я обратился к контейнерам LXC/LXD, и это здорово. После установки LXD я создал свой собственный контейнер:

>> willem@ubuntu:/$ lxc launch images:centos/7/amd64 thing Creating thing
Starting thing 
>> willem@ubuntu:/$ lxc list
+-------+---------+------------------+------+------------+-----------+ 
| NAME  |  STATE  |       IPV4       | IPV6 |    TYPE    | SNAPSHOTS |
+-------+---------+------------------+------+------------+-----------+ 
| thing | RUNNING | 10.0.3.30 (eth0) |      | PERSISTENT |         0 |
+-------+---------+------------------+------+------------+-----------+

Отлично. Только я, кажется, не имею никакого контроля над IP-адресом здесь. Я нашел (с помощью Google и найдите) контрольный файл:

>> root@ubuntu:/# locate lxc.conf 
/etc/init/lxc.conf 
..
/var/log/lxd/thing/lxc.conf

в котором вы можете поместить (как выглядит) статический IP4-адрес. Только после перезагрузки контейнера хост, кажется, забыл мой статический IP-адрес и получает его от DHCP. Вопросы:

  • Что такое правильный способ сделать это (я имею в виду, последняя Docker имеет --ip переключатель в docker run , который устанавливает IP - адрес)?

5 ответов5

5

Если вы хотите указать IP-адреса для контейнеров в LXD, посмотрите файл /etc /default /lxd-bridge. Там вы найдете место для подключения внешнего файла конфигурации dnsmasq.

Предполагая, что вы находитесь на Ubuntu 16.04,

Откройте /etc /default /lxd-bridge в вашем любимом редакторе. Вам нужно будет использовать sudo.

Вокруг линии 16,

LXD_CONFILE = ""

Добавьте запись, которая указывает на файл конфигурации dnsmasq. Вам нужно будет создать этот файл. Назовите это как хотите. Что-то вроде lxd_bridge.conf.

Затем создайте и отредактируйте файл, который вы назвали выше.

Добавьте строку для каждого контейнера, которому вы хотите назначить определенный IP-адрес.

Как это:

DHCP-хост = ИмяКонтейнер, IPAddress

Затем вам нужно будет перезапустить lxd-bridge, а затем перезапустить контейнеры.

Вот подробная статья об этом:

LXD Статические IP-адреса

Обратите внимание, что если вы запускаете Alpine linux в своих контейнерах, необходимо предпринять дополнительные шаги, чтобы сделать это. высокогорный

3

Информация о системе: lxc-3.0.1 на Ubuntu Server 18.04.1 .

После долгих поисков я нашел эту простую команду для назначения статического ip для контейнера:

lxc config set [container] raw.lxc 'lxc.net.[i].ipv4.address = [ip]/[subnet-mask]'

где [container] , [i] , [ip] и [subnet-mask] - это имя контейнера, номер сетевого интерфейса, требуемый статический IP-адрес и CIDR для требуемой маски подсети, соответственно.

Например, если вы хотите назначить 240.10.0.20 с маской подсети 255.255.255.0 для 0-го сетевого интерфейса контейнера с именем hello , вы можете использовать:

lxc config set hello raw.lxc 'lxc.net.0.ipv4.address = 240.10.0.20/24'

Посмотрите здесь приемлемые ключи конфигурации, добавляемые в lxc.net.[i] . Эта веб-страница содержит информацию о нотации CIDR.

Возможно, вам потребуется перезапустить контейнер после выполнения команды.

К сожалению, я не могу вспомнить, где я впервые нашел это решение. Вот актуальная проблема GitHub, которая может содержать полезную информацию.

3

Эти конфигурации должны быть помещены в файл /var/lib/lxc/ContainerName/config . Возможные значения параметров указаны в Руководстве . Они относятся к различным областям, имени хоста, сети, консоли, ttys, точке монтирования, группам, возможностям, ...

Под сетью вы найдете все, что вам нужно. Значимые значения автоматически создаются для неопределенных переменных. Часть, наиболее актуальная для вашего вопроса, следующая:

lxc.network.name

имя интерфейса выделяется динамически, но если требуется другое имя, потому что файлы конфигурации, используемые контейнером, используют общее имя, например. eth0, эта опция переименует интерфейс в контейнере.

lxc.network.hwaddr

MAC-адрес интерфейса динамически назначается виртуальному интерфейсу по умолчанию, но в некоторых случаях это необходимо для разрешения конфликта MAC-адресов или для того, чтобы всегда иметь один и тот же локальный IPv-адрес канала.

lxc.network.ipv4

укажите адрес ipv4 для назначения виртуализированному интерфейсу. Несколько строк указывают несколько адресов ipv4. Адрес в формате xyzt /m, например. 192.168.1.123/24. Широковещательный адрес должен быть указан в той же строке, сразу после адреса ipv4.

lxc.network.ipv4.gateway

укажите адрес ipv4 для использования в качестве шлюза внутри контейнера. Адрес в формате xyzt, например. 192.168.1.123. Может также иметь специальное значение auto, что означает получение основного адреса из интерфейса моста (как указано в параметре lxc.network.link) и использование его в качестве шлюза. Авто доступно только при использовании типов сетей veth и macvlan.

0

Для тех, кто все еще борется с тем, как назначить статические IP-адреса контейнерам lxd.

Моей первой попыткой было сделать это через dnsmasq, поэтому я добавил IP-адреса контейнеров в /var/lib/lxd/networks/lxdbr0/dnsmasq.hosts/<container> и перезагрузил службу dnsmasq. Это действительно работало, но не сохранялось после перезапуска Хоста.

Я думал, что этого можно достичь с помощью инструмента lxd. На самом деле это было упомянуто в ЖК-документ. Я действительно не знал, как настроить ключ user.network-config с помощью команды lxc config set <container> user.network-config <value> . Так как я не мог ввести несколько ключей: значения в аргументе значения.

  1. проверьте контейнерную подсеть

    lxc network show lxdbr0
    
  2. Сначала создайте файл yml (network.yml) со следующим значением

    version: 1
    config:
      - type: physical
        name: eth1
        subnets:
          - type: static
            ipv4: true
            address: <ip>
            netmask: 255.255.255.0
            gateway: <gateway> // ends often with .1
            control: auto
      - type: nameserver
        address: 8.8.8.8       // for example
    
  3. создать контейнер с этой конфигурацией сети

    lxc launch ubuntu:18.04 test --config=user.network-config="$(cat network.yml)"    
    

воала :)

Я пытался изменить IP-адрес после создания контейнера

   lxc config set <container> user.network-config "$(cat network.yml)"

я перезапустил контейнер, но IP не обновился. Если кто-то знает, как заставить его работать после создания контейнера, я буду очень благодарен.

LXD версия 3.0.1

0

Я нашел решение здесь

Спасибо Стефану Граберу.

Цитата:

«Если вы используете современный LXD с управляемым мостом LXD, вы можете просто установить свойство ipv4.address в сетевом интерфейсе контейнера.

  • lxc stop c1
  • подключение к сети lxc lxdbr0 c1 eth0 eth0
  • lxc config device set c1 eth0 ipv4.address 10.99.10.42
  • lxc start c1

"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .