Docker + Mosty + DHCP

13

Mam wiele kontenerów dokerów, których potrzebuję do adresowania w tej samej sieci LAN, co ich hosty. Do tej pory osiągałem to poprzez konfigurację mostu i ręczne przypisywanie im adresów IP oraz samodzielne zarządzanie adresami IP. Przykładowy start wyglądałby tak:

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]

Host ma zdefiniowany mostek w /etc/network/interfaces(ubuntu) w następujący sposób:

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

Odkąd odkryłem poddaństwo , staram się przejść do automatycznego wykrywania w kontenerach, aby DHCP mógł śledzić adresy IP i przekazywać je do kontenerów. Od tego czasu zmieniłem polecenie uruchamiania na:

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

i most do:

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

Spowodowało to uruchomienie kontenera, ale nie posiadało adresu IP. Następnie skorzystałem z porady w internetowym poście, któremu udało się to zrobić z Fedorą, dzwoniąc dhclient. Niestety nie działa to dla mnie w kontenerach opartych na Ubuntu.

Poniżej znajdują się następujące komunikaty o błędach, które otrzymuję w różnych warunkach:

  • Uruchamianie dhclientpo włączeniu --privilegeduruchamiania kontenera:

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • Uruchamianie, sudo dhclient eth0gdy nie ma--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • Uruchomiony sudo dhclientlub dhclient(nie określono interfejsu).

    Zwraca natychmiast i nadal nie ma połączenia IP ani połączenia sieciowego.

Jak mogę zmusić kontenery dokujące do pobierania dynamicznych adresów IP z tej samej podsieci co ich hosty, tak że mogę wdrażać kontenery na wielu hostach bez śledzenia adresów IP?

Informacje dodatkowe

  • uruchomiony DOCKER_OPTS="-e lxc"w/etc/default/docker
  • Hostem jest Ubuntu 14.04
  • Kontenery Docker są budowane przy użyciu from ubuntu:14.04pliku Docker.
Programista
źródło

Odpowiedzi:

3

Wygląda na to, że jest to kwestia otwarta i dotyczy wyłącznie kontenerów i aplikacji Ubuntu.

Zostało tam opublikowane obejście od bprodoehl:

  • Uruchom kontener zgodnie z uprawnieniami --privileged
  • Dodaj następujący wiersz do pliku dockerfile: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • Uruchom, dhclient eth0a zobaczysz komunikat o błędzie:, mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busyale teraz masz adres IP i możesz korzystać z sieci.
Programista
źródło
w moim przypadku działa to jak urok, ale dlaczego ten mv jest potrzebny? Czy możesz to wyjaśnić?
Federico Bonelli
Tak było w rozwiązaniu, które napisał facet (do którego podłączyłem) i wydaje się, że działa. Być może ktoś inny może to wyjaśnić.
Programster
1
@Federico Bonelli: Apparmor stosuje ograniczenia bezpieczeństwa do zarządzanych aplikacji. Zarządza tylko aplikacjami, dla których ma definicje zasad. Te zasady pasują do aplikacji na podstawie ich ścieżki. Po przeprowadzce dhclientz /sbindo /usr/sbindefinicji polityki apparmor nie pasuje już i AppArmor nie stosuje się żadnych ograniczeń zabezpieczeń do tego „nieznany” aplikacji.
papryka
Musiałem skorzystać z „sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient”, ponieważ obejście tego nie zrobiło, to był kontener Ubuntu 14.04. Widziano jednak powyższy komunikat o błędzie i następnie przypisano adres IP.
Neil McGill,
1

Znalazłem skrypt

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

robi dokładnie to, co chcesz (obejście wspomniane przez Programster).

Polecenie mv jest potrzebne, ponieważ po uruchomieniu kontenera dokowanego w trybie uprzywilejowanym doker nie definiuje profilu AppArmor dla kontenera. Tak więc używany jest profil AppArmor domyślny dla komputera i uniemożliwia on uruchomienie dhclient w domyślnej ścieżce.

Dmitriusan
źródło
1

jeśli próbujesz uzyskać adres dhcp w kontenerze dokera ubuntu, wykonaj następujące czynności:

  1. ustaw opcję dns na komendzie daemon docker ( --dns <my_dns_ip>)
  2. otwórz /etc/dhcp/dhclient.confi edytuj wiersz zawierający request subnet-mask, broadcast-address...i usuń słowadomain-name, domain-name-servers
  3. następnie po zastosowaniu service networking restartotrzymasz nowy adres dhcp bez komunikatów o błędach
użytkownik99240
źródło
-2

Inną możliwością jest użycie „orurowania”. Musisz uruchomić go poza kontenerem. https://github.com/jpetazzo/pipework

użytkownik90299
źródło
5
Witam i witam na stronie. Chcemy, aby odpowiedzi były tutaj nieco bardziej wyczerpujące. Czy mógłbyś edytować i wyjaśnić, co to pipeworkjest, gdzie można go znaleźć, jak można go zainstalować, być może podać przykład jego zastosowania? W obecnej formie twoja odpowiedź jest komentarzem, a nie odpowiedzią.
terdon