Докер + Мосты + DHCP

13

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

docker run \
--net="none" \ \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.ipv4 = 192.168.1.3/24" \
--lxc-conf="lxc.network.ipv4.gateway = 192.168.1.254" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.name = eth0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]

С хостом, имеющим мост, определенный в /etc/network/interfaces(ubuntu), примерно так:

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.1.2
        netmask 255.255.255.0
        gateway 192.168.1.254
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

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

docker run \
--net="none" \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]
/bin/bash

и мост к:

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

Это привело к запуску контейнера, но без IP. Затем я воспользовался советом из поста в Интернете, которому удалось это сделать с помощью Fedora, позвонив по телефону dhclient. К сожалению, это не работает для меня в контейнерах на основе Ubuntu.

Ниже приведены следующие сообщения об ошибках, которые я получаю при разных условиях:

  • Запуск, dhclientкогда я включил --privilegedзапуск контейнера:

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • Бег, sudo dhclient eth0когда не в--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • Запуск sudo dhclientили dhclient(интерфейс не указан).

    Возвращается немедленно и все еще нет IP или сетевого подключения.

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

Дополнительная информация

  • Работает DOCKER_OPTS="-e lxc"в/etc/default/docker
  • Хост Ubuntu 14.04
  • Контейнеры Docker создаются с использованием from ubuntu:14.04Dockerfile.
Programster
источник

Ответы:

3

Похоже, что это нерешенная проблема, относящаяся к контейнерам и устройствам Ubuntu.

Обход был опубликован там от bprodoehl:

  • Запустите контейнер как привилегированный с --privileged
  • Добавьте следующую строку в dockerfile: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • Запустите, dhclient eth0и вы все равно увидите сообщение об ошибке:, mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busyно теперь у вас будет IP, и вы сможете использовать сеть.
Programster
источник
это работает как брелок для моего случая, но зачем нужен этот mv? Вы можете объяснить, пожалуйста?
Федерико Бонелли
Это было то, что было в решении, опубликованном парнем (на который я ссылался), и похоже, что оно работает. Возможно, кто-то еще может объяснить.
Programster
1
@Federico Bonelli: Apparmor применяет ограничения безопасности к приложениям, которыми управляет. Он управляет только приложениями, для которых у него есть определения политики. Эти политики соответствуют приложениям в зависимости от их пути. При переходе dhclientот /sbinк /usr/sbinопределению политики AppArmor не будет соответствовать больше и Apparmor не будут применяться какие - либо ограничения безопасности для этого «неизвестного» приложения.
паприка
Мне пришлось прибегнуть к "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient", так как обходной путь не сделал, это был контейнерный файл Ubuntu 14.04. Однако сообщение об ошибке выше было замечено, и затем был назначен IP-адрес.
Нил МакГилл
1

Я нашел скрипт

https://github.com/jkrauska/tech-notes/blob/master/docker-dhclient.md

это именно то, что вы хотите (обходной путь, упомянутый Programster).

Команда mv необходима, поскольку при запуске контейнера Docker в привилегированном режиме Docker не определяет профиль AppArmor для контейнера. Таким образом, используется профиль AppArmor по умолчанию для машины, и он не позволяет запускать dhclient по его пути по умолчанию.

Dmitriusan
источник
1

Если вы пытаетесь получить адрес DHCP в Docker-контейнере Ubuntu, просто сделайте следующее:

  1. установить опцию dns на команду docker daemon ( --dns <my_dns_ip>)
  2. открыть /etc/dhcp/dhclient.confи отредактировать строку, которая содержит request subnet-mask, broadcast-address...и удалить словаdomain-name, domain-name-servers
  3. тогда после применения service networking restartвы получите новый адрес DHCP без сообщений об ошибках
user99240
источник
-2

Другая возможность - использовать «трубопровод». Вам нужно запустить его за пределами вашего контейнера. https://github.com/jpetazzo/pipework

user90299
источник
5
Привет и добро пожаловать на сайт. Нам нравятся ответы, которые будут немного более полными здесь. Не могли бы вы отредактировать и объяснить, что pipework, где можно найти, как установить, возможно, привести пример его использования? На самом деле ваш ответ - это комментарий, а не ответ.
Тердон