Docker + ponts + DHCP

13

J'ai beaucoup de conteneurs Docker dont j'ai besoin adressable sur le même LAN que leurs hôtes. Jusqu'à présent, j'ai atteint cet objectif en utilisant la configuration d'un pont et en leur attribuant manuellement des adresses IP , et en gérant moi-même les adresses IP. Un exemple de démarrage serait comme ceci:

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]

Avec l'hôte ayant le pont défini dans /etc/network/interfaces(ubuntu) comme ceci:

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

Depuis que j'ai découvert serf , j'ai essayé de passer à l'utilisation de la découverte automatique dans les conteneurs, afin que DHCP puisse garder une trace des adresses IP et les distribuer aux conteneurs. J'ai depuis changé la commande de démarrage en:

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

et le pont vers:

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

Cela a entraîné le démarrage du conteneur, mais sans IP. J'ai ensuite pris conseil auprès d' un poste en ligne qui a réussi à le faire avec Fedora, en appelant dhclient. Malheureusement, cela ne fonctionne pas pour moi dans les conteneurs basés sur Ubuntu.

Voici les messages d'erreur suivants que j'obtiens dans différentes conditions:

  • En cours d'exécution dhclientlorsque j'ai activé le --privilegeddémarrage du conteneur:

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • Courir sudo dhclient eth0en dehors--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • En cours d'exécution sudo dhclientou dhclient(aucune interface spécifiée).

    Retourne immédiatement et il n'y a toujours pas de connectivité IP ou réseau.

Comment puis-je obtenir des conteneurs Docker pour récupérer des adresses IP dynamiques du même sous-réseau que leurs hôtes, de sorte que je puisse déployer des conteneurs sur plusieurs hôtes sans suivre les adresses IP?

Informaitons supplémentaires

  • courir DOCKER_OPTS="-e lxc"en/etc/default/docker
  • L'hôte est Ubuntu 14.04
  • Les conteneurs Docker sont construits à l'aide from ubuntu:14.04du Dockerfile.
Programster
la source

Réponses:

3

Il semble que ce soit un problème ouvert et qu'il soit spécifique aux conteneurs Ubuntu et à l'apparmeur.

Une solution de contournement y a été publiée par bprodoehl:

  • Démarrez le conteneur en tant que privilégié avec --privileged
  • Ajoutez la ligne suivante au dockerfile: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • Exécutez dhclient eth0et vous verrez toujours le message d'erreur:, mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busymais vous aurez maintenant une adresse IP et vous pourrez utiliser le réseau.
Programster
la source
cela fonctionne comme un charme pour mon cas, mais pourquoi ce mv est-il nécessaire? Pouvez-vous expliquer s'il vous plaît?
Federico Bonelli du
C'est ce qui était dans la solution que le gars a posté (auquel j'ai lié) et cela semble fonctionner. Peut-être que quelqu'un d'autre peut expliquer.
Programster
1
@Federico Bonelli: Apparmor applique des restrictions de sécurité aux applications qu'il gère. Il gère uniquement les applications pour lesquelles il a des définitions de stratégie. Ces politiques correspondent aux applications en fonction de leur chemin d'accès. Lorsque vous passez dhclientde /sbinà /usr/sbinla définition de la politique Apparmor ne correspondra pas à plus et Apparmor ne s'appliquera des restrictions de sécurité à cette application « inconnue ».
paprika
J'ai dû recourir à "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient" car la solution de contournement ne l'a pas été, il s'agissait d'un conteneur ubuntu 14.04 fyi. Cependant, le message d'erreur ci-dessus a été vu et une adresse IP a ensuite été attribuée.
Neil McGill
1

J'ai trouvé un script

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

qui fait exactement ce que vous voulez (la solution de contournement mentionnée par Programster).

La commande mv est nécessaire, car lorsque vous exécutez le conteneur Docker en mode privilégié, Docker ne définit pas le profil AppArmor pour le conteneur. Le profil AppArmor par défaut de la machine est donc utilisé et il vous empêche d'exécuter dhclient sur son chemin par défaut.

Dmitriusan
la source
1

Si vous essayez d'obtenir une adresse DHCP sur un conteneur Docker Ubuntu, procédez comme suit:

  1. définir l'option dns sur votre commande de démon docker ( --dns <my_dns_ip>)
  2. ouvrir /etc/dhcp/dhclient.confet modifier la ligne qui contient request subnet-mask, broadcast-address...et supprimer les motsdomain-name, domain-name-servers
  3. puis après l'application, service networking restartvous obtiendrez une nouvelle adresse dhcp sans messages d'erreur
user99240
la source
-2

L'autre possibilité consiste à utiliser la «tuyauterie». Vous devez l'exécuter en dehors de votre conteneur. https://github.com/jpetazzo/pipework

user90299
la source
5
Bonjour et bienvenue sur le site. Nous aimons que les réponses soient un peu plus complètes ici. Pourriez-vous éditer et expliquer ce qu'est pipework, où on peut le trouver, comment il peut être installé, peut-être donner un exemple de son utilisation? En l'état, votre réponse est un commentaire et non une réponse.
terdon