Docker + Bridges + DHCP

13

Saya memiliki banyak kontainer buruh pelabuhan yang perlu saya addressable di LAN yang sama dengan host mereka. Sampai sekarang, saya telah mencapai ini dengan menggunakan pengaturan jembatan dan secara manual menetapkan mereka IP , dan mengelola IP sendiri. Contoh startup akan seperti ini:

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]

Dengan host yang mendefinisikan bridge di /etc/network/interfaces(ubuntu) seperti:

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

Sejak saya menemukan budak , saya telah mencoba untuk pindah menggunakan penemuan otomatis dalam wadah, sehingga DHCP dapat melacak IP dan membagikannya ke wadah. Saya sejak mengubah perintah startup ke:

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

dan jembatan ke:

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

Ini mengakibatkan wadah memulai, tetapi tidak memiliki IP. Saya kemudian menerima saran dari sebuah posting online yang berhasil menyelesaikannya dengan Fedora, dengan menelepon dhclient. Sayangnya ini tidak berfungsi untuk saya dalam wadah berbasis ubuntu.

Di bawah ini adalah pesan kesalahan berikut yang saya dapatkan dalam kondisi yang berbeda:

  • Berjalan dhclientketika saya telah mengaktifkan --privilegeddalam memulai wadah:

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • Berjalan sudo dhclient eth0saat tidak ada--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • Lari sudo dhclient atau dhclient(tidak ada antarmuka yang ditentukan).

    Segera kembali dan masih belum ada konektivitas IP atau jaringan.

Bagaimana saya bisa mendapatkan buruh pelabuhan untuk mengambil IP dinamis dari subnet yang sama dengan host mereka, sehingga saya bisa menggunakan kontainer di banyak host tanpa melacak IP?

Informasi tambahan

  • Lari DOCKER_OPTS="-e lxc" masuk/etc/default/docker
  • Host adalah Ubuntu 14.04
  • Wadah Docker dibuat menggunakan from ubuntu:14.04Dockerfile.
Programster
sumber

Jawaban:

3

Tampaknya ini adalah masalah terbuka dan apakah ini khusus untuk kontainer dan apparmor Ubuntu.

Penanganan masalah telah diposting di sana dari bprodoehl:

  • Mulai wadah sebagai hak istimewa --privileged
  • Tambahkan baris berikut ke dockerfile: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • Jalankan dhclient eth0dan Anda masih akan melihat pesan kesalahan:, mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busytetapi sekarang Anda akan memiliki IP dan Anda dapat menggunakan jaringan.
Programster
sumber
itu bekerja seperti pesona untuk kasus saya, tetapi mengapa itu perlu saya? Bisakah Anda jelaskan?
Federico Bonelli
Itulah yang ada di solusi yang diposting orang itu (yang saya tautkan) dan tampaknya berfungsi. Mungkin orang lain bisa menjelaskan.
Programster
1
@Federico Bonelli: Apparmor menerapkan batasan keamanan untuk aplikasi yang dikelolanya. Ia mengelola hanya aplikasi yang memiliki definisi kebijakan. Kebijakan ini cocok dengan aplikasi berdasarkan jalurnya. Ketika Anda pindah dhclientdari /sbinke /usr/sbindefinisi kebijakan Apparmor tidak akan cocok lagi dan Apparmor tidak akan menerapkan batasan keamanan apa pun untuk aplikasi "tidak dikenal" ini.
paprika
Saya harus menggunakan "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient" karena solusinya tidak, ini adalah wadah Ubuntu 14,04 fyi. Namun pesan kesalahan di atas terlihat dan alamat IP kemudian ditetapkan.
Neil McGill
1

Saya telah menemukan skrip

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

yang melakukan persis apa yang Anda inginkan (solusi yang disebutkan oleh Programster).

Perintah mv diperlukan, karena ketika Anda menjalankan docker container dalam mode privilege, docker tidak mendefinisikan profil AppArmor untuk container. Jadi profil AppArmor default-mesin digunakan, dan itu mencegah Anda menjalankan dhclient di jalur defaultnya.

Dmitriusan
sumber
1

jika Anda mencoba untuk mendapatkan alamat dhcp pada wadah buruh pelabuhan ubuntu lakukan saja hal berikut:

  1. setel opsi dns pada perintah docker daemon Anda (--dns <my_dns_ip> )
  2. buka /etc/dhcp/dhclient.confdan edit baris yang berisi request subnet-mask, broadcast-address...dan hapus kata-katadomain-name, domain-name-servers
  3. kemudian setelah menerapkan service networking restartAnda akan mendapatkan alamat dhcp baru tanpa pesan kesalahan
pengguna99240
sumber
-2

Kemungkinan lainnya adalah menggunakan "pipework." Anda harus menjalankannya di luar wadah Anda. https://github.com/jpetazzo/pipework

user90299
sumber
5
Hai dan selamat datang di situs ini. Kami ingin jawaban menjadi lebih komprehensif di sini. Bisakah Anda mengedit dan menjelaskan apa pipework, di mana orang dapat menemukannya, bagaimana itu dapat diinstal, mungkin memberikan contoh penggunaannya? Seperti berdiri, jawaban Anda adalah komentar dan bukan jawaban.
terdon