web-dev-qa-db-fra.com

Donner à un conteneur Docker une adresse IP routable

J'exécute cela sur Ubuntu 14.04 et j'ai défini docker0 Sur une IP statique qui est ensuite acheminée vers l'IP publique via le pare-feu. J'essaie de configurer mon API dorsale pour qu'elle s'exécute dans un conteneur Docker et je suis confus par deux ou trois choses.

1.) Comment mapper l'IP de docker0 À l'IP du conteneur de telle sorte que docker0 Sache envoyer les paquets entrants au conteneur (dynamiquement si possible).

2.) Si ce n'est pas déjà fait de cette manière, comment pourrais-je faire en sorte que je n'aie pas à le configurer à chaque fois que je refasse ce conteneur docker?

Merci d'avance!

25
robert

Je suppose que vous voulez avoir une adresse IP attribuée à votre conteneur Docker en dehors de Docker.

Créez d'abord une nouvelle adresse IP et affectez-la à l'interface de votre hôte (nous supposons que votre interface s'appelle eth0.

$> ip addr add 10.0.0.99/8 dev eth0

Maintenant, lorsque vous lancez le conteneur, spécifiez cette adresse et liez-la à votre conteneur Docker:

$> docker run -i -t --rm -p 10.0.0.99:80:8080 base

L'argument -p obligera docker à créer une règle iptables NAT qui natera tout le trafic correspondant à la destination 10.0.0.99:80 à votre conteneur docker sur le port 8080.

Si vous avez besoin d'automatiser le processus et de le faire évoluer, consultez cette ressource: https://github.com/jpetazzo/pipework

La documentation de docker est un bon début: https://docker.github.io/engine/userguide/networking/

39
nucatus

Récemment, j'ai eu le même problème et l'ai résolu en utilisant Conteneurs réseau :

  • Démarrer mon conteneur "service" que je souhaite être disponible sur l'IP publique
  • Créez un nouveau conteneur "réseau" lié au conteneur de service et acheminant vers les ports exposés par le conteneur de service. Ce conteneur aura une interface réseau supplémentaire reliée à l'hôte afin qu'il puisse acquérir une IP à partir de DHCP.
  • Créez un pont réseau de l'hôte Docker au conteneur à l'aide de Pipework de jpetazzo ( https://github.com/jpetazzo/pipework )
  • Le conteneur réseau acquiert une adresse de DHCP.

À partir de ce moment, le conteneur réseau est disponible sur le réseau et achemine les ports vers le conteneur de service. Le principal avantage est que le conteneur "service" n'a pas besoin de connaître l'adresse IP publique, DHCP, etc. De cette façon, chaque conteneur en cours d'exécution peut être rendu public sur le réseau.

Pour plus de commodité, j'ai créé un script qui fait tout cela en même temps. Rendre un conteneur en cours d'exécution disponible sur une IP publique est aussi simple que:

create-network-container.sh webserver ens32

Dans ce cas, vous devez disposer d'un conteneur en cours d'exécution appelé "serveur Web" et d'une interface réseau sur l'hôte "ens32". L'interface est nécessaire pour créer le pont dans le conteneur réseau.

Le script, des informations plus détaillées et des exemples sont disponibles sur: https://github.com/jeroenpeeters/docker-network-containers

9
Jeroen Peeters