Докер + Мости + 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

Оскільки я виявив кріпака , я намагався перейти до використання автоматичного виявлення в контейнерах, щоб 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-адреси з тієї самої підмережі, що і їх хости, щоб я міг розгорнути контейнери через декілька хостів без відстеження IP-адрес?

Додаткова інформація

  • Біг DOCKER_OPTS="-e lxc"в/etc/default/docker
  • Хост - Ubuntu 14.04
  • Докер-контейнери будуються за from ubuntu:14.04допомогою Dockerfile.

Відповіді:


3

Здається, це відкрите питання, і це специфічно для контейнерів Ubuntu та apparmor.

Там було розміщено вирішення від bprodoehl:

  • Запустіть контейнер, як привілейовано --privileged
  • Додайте наступний рядок до докерфайлу: 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

1
@Federico Bonelli: Apparmor застосовує обмеження безпеки щодо керованих програм. Він управляє лише програмами, для яких є визначення політики. Ці політики відповідають програмам на основі їх шляху. При переході dhclientвід /sbinдо /usr/sbinвизначення політики AppArmor не буде відповідати більше і Apparmor не застосовуватимуться які - небудь обмеження безпеки для цього «невідомого» додатка.
паприка

Мені довелося вдатися до "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient", як цього не вирішили, це був контейнер fbui ubuntu 14.04. Однак повідомлення про помилку було видно вище, і тоді була призначена IP-адреса.
Ніл Макгілл

1

Я знайшов сценарій

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

це робить саме те, що ви хочете (рішення, яке згадує Programster).

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


1

якщо ви намагаєтеся отримати адресу dhcp на контейнері докера 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 адресу без повідомлень про помилки

-2

Інша можливість - використовувати "трубопровід". Потрібно запустити його поза контейнером. https://github.com/jpetazzo/pipework


5
Привіт і ласкаво просимо на сайт. Нам подобається, що відповіді тут є трохи більш вичерпними. Чи можете ви відредагувати та пояснити, що pipeworkтаке, де його можна знайти, як його встановити, можливо, навести приклад його використання? На даний момент ваша відповідь - це коментар, а не відповідь.
terdon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.