Docker + Köprüler + DHCP


13

Ben onların ana bilgisayarları ile aynı LAN adreslenebilir gereken docker kapları bir sürü var. Şimdiye kadar bunu bir köprü kurarak ve IP'leri manuel olarak atayarak ve IP'leri kendim yöneterek başardım. Örnek bir başlangıç ​​şöyle olacaktır:

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]

Ana bilgisayar /etc/network/interfaces(ubuntu) 'da tanımlanan köprüye sahip olarak :

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'i keşfettiğimden beri , DHCP'nin IP'leri takip edebilmesi ve bunları konteynerlere dağıtabilmesi için kaplarda otomatik keşif kullanmaya geçmeye çalışıyorum. O zamandan beri başlangıç ​​komutunu şöyle değiştirdim:

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

ve köprü:

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

Bu konteynerin açılmasına neden oldu, ancak IP'si yoktu. Daha sonra , Fedora ile görüşmeyi başaran çevrimiçi bir gönderiden tavsiye aldım dhclient. Ne yazık ki bu benim için Ubuntu tabanlı kaplarda çalışmıyor.

Farklı koşullar altında aldığım aşağıdaki hata iletileri şunlardır:

  • Koşu dhclientBen etkinleştirdiğimde --privilegedkonteyner başlayarak:

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • İçinde sudo dhclient eth0değilken çalışıyor--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • Çalışıyor sudo dhclientveya dhclient(arabirim belirtilmemiş).

    Hemen geri döner ve hala IP veya ağ bağlantısı yoktur.

IP'leri izlemeden birden çok ana bilgisayara kapsayıcı dağıtabilmem için docker kapsayıcılarını ana bilgisayarlarıyla aynı alt ağdan dinamik IP'leri nasıl alabilirim?

Fazladan bilgi

  • Koşu DOCKER_OPTS="-e lxc"içinde/etc/default/docker
  • Ev sahibi Ubuntu 14.04
  • Docker kapları from ubuntu:14.04Dockerfile içinde oluşturulur.

Yanıtlar:


3

Bunun açık bir sorun olduğu ve bu Ubuntu kapsayıcılarına ve barizlerine özgü olduğu anlaşılıyor.

Buraya bprodoehl'den bir geçici çözüm gönderildi:

  • Kapsayıcıyı aşağıdaki gibi ayrıcalıklı olarak başlatın: --privileged
  • Dockerfile dosyasına aşağıdaki satırı ekleyin: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • Çalıştırın dhclient eth0ve hala hata mesajını göreceksiniz: mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busyancak artık bir IP'niz olacak ve ağı kullanabilirsiniz.

benim durumum için bir cazibe gibi çalışıyor, ama neden bu mv gerekli? Açıklayabilir misiniz lütfen?
Federico Bonelli

Adam (ki ben bağlantılı) yayınlanan çözümde ne olduğunu ve işe yarıyor gibi görünüyor. Belki başka biri açıklayabilir.
Programcı

1
@Federico Bonelli: Apparmor, yönettiği uygulamalara güvenlik kısıtlamaları uygular. Yalnızca ilke tanımlarına sahip olduğu uygulamaları yönetir. Bu politikalar uygulamaları yollarına göre eşleştirir. Eğer taşıdığınızda dhclientgelen /sbinetmek /usr/sbinAppArmor politika tanımı artık uymayacak ve AppArmor'u bu "bilinmeyen" uygulaması için herhangi bir güvenlik kısıtlamaları uygulanmaz.
paprika

Geçici çözüm yoktu gibi "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient" başvurmak zorunda kaldı, bu bir ubuntu 14.04 konteyner fyi oldu. Ancak yukarıdaki hata mesajı görüldü ve daha sonra bir IP adresi atandı.
Neil McGill

1

Bir senaryo buldum

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

tam olarak ne istediğinizi yapar (Programster tarafından belirtilen geçici çözüm).

Mv komutu gereklidir, çünkü docker kapsayıcısını ayrıcalıklı modda çalıştırdığınızda, docker kap için AppArmor profilini tanımlamaz. Bu nedenle, makine varsayılanı AppArmor profili kullanılır ve dhclient'i varsayılan yolunda çalıştırmanızı önler.


1

bir ubuntu docker kapsayıcısında bir dhcp adresi almaya çalışıyorsanız, sadece aşağıdakileri yapın:

  1. docker daemon command ( --dns <my_dns_ip>) üzerinde dns seçeneğini ayarla
  2. Açık /etc/dhcp/dhclient.confve düzenleme içeren çizgi request subnet-mask, broadcast-address...ve kelimeler çıkarındomain-name, domain-name-servers
  3. uyguladıktan sonra service networking restarthata mesajları olmadan yeni bir dhcp adresi alırsınız

-2

Diğer olasılık "boru tesisatı" kullanmaktır. Konteynerinizin dışında çalıştırmanız gerekir. https://github.com/jpetazzo/pipework


5
Merhaba ve siteye hoş geldiniz. Yanıtların burada biraz daha kapsamlı olmasını seviyoruz. Neyi pipework, nerede bulabilir, nasıl kurulabileceğini düzenleyebilir ve açıklayabilir misiniz , belki kullanımına bir örnek verebilir misiniz? Haliyle, cevabınız bir cevap değil, bir yorumdur.
terdon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.