web-dev-qa-db-fra.com

Comment faire en sorte que docker-compose lie les conteneurs uniquement sur un réseau défini au lieu de 0.0.0.0?

Dans les versions récentes, docker-compose crée automatiquement un nouveau réseau pour les services qu'il crée. Fondamentalement, chaque configuration docker-compose obtient sa propre plage IP, de sorte qu'en théorie, je pourrais appeler mes services sur l'adresse IP du réseau avec les ports prédéfinis. C’est formidable lorsque vous développez plusieurs projets en même temps, car il n’est alors pas nécessaire de modifier les ports dans docker-compose.yml (c’est-à-dire que je peux exécuter plusieurs projets nginx simultanément sur le port 8080 sur différentes interfaces).

Cependant, cela ne fonctionne pas comme prévu: chaque port exposé est toujours exposé sur 0.0.0.0 et il existe donc des conflits de ports avec plusieurs projets. Il est possible de mettre l'adresse IP liée dans docker-compose.yml, mais il s'agit d'une excellente solution pour la portabilité. Tous les développeurs de l'équipe n'utilisent pas le même système d'exploitation ni ne travaillent sur les mêmes projets. Par conséquent, l'adresse IP à configurer n'est pas clairement définie.

Il serait bon de définir l'adresse IP à laquelle lier les conteneurs en termes de réseau créé pour ce projet particulier. docker-compose devrait savoir à la fois le réseau créé et son adresse IP. Cela ne devrait donc pas être un problème, mais je ne trouvais pas de moyen facile de le faire. Y at-il un moyen ou est-ce quelque chose qui doit encore être mis en œuvre?

EDIT: Exemple de conflit de port: imaginez deux projets, chacun avec un serveur d’application fonctionnant sur le port 8080 et une base de données MySQL exécutée sur le port 3306, tous deux exposés respectivement sous les noms "8080: 8080" et "3306: 3306". L'exécution du premier avec docker-compose crée un réseau appelé quelque chose comme app1_network avec une plage d'adresses IP de 172.18.0.0/16. Chaque port exposé est exposé à 0.0.0.0, c’est-à-dire à 127.0.0.1, à l’adresse WAN, au pont par défaut (172.17.0.0/16) et également à 172.18.0.0/16. Dans ce cas, je peux atteindre mon serveur d'applications de 127.0.0.1:8080, 172.17.0.1:8080, 172.18.0.1:8080 et als sur $WAN_IP:8080. Si je lance la deuxième application maintenant, il lance un deuxième réseau app2_network 172.19.0.0/16, mais tente néanmoins de lier tous les ports exposés sur toutes les interfaces. Ces ports sont bien sûr déjà pris (sauf pour 172.19.0.1). S'il y avait une possibilité de restreindre chaque application à son réseau, l'application 1 aurait été disponible à 172.18.0.1:8080 et la seconde à 172.19.0.1:8080 et je n'aurais pas besoin de changer les mappages de ports en 8081 et 3307 respectivement. exécuter les deux applications en même temps. 

7

Dans la configuration de votre service, dans docker-compose.yml:

ports:
 - "127.0.0.,:8001:8001"

Référence: https://docs.docker.com/compose/compose-file/#ports

11
Mohammed Noureldin

Vous pouvez publier un port sur une adresse IP unique sur l'hôte en incluant l'adresse IP avant les ports:

docker run -p 127.0.0.1:80:80 -d nginx

Ce qui précède exécute nginx sur l'interface de bouclage. Vous pouvez utiliser un mappage de port similaire dans un fichier docker-compose.yml. par exemple.:

ports:
  - "127.0.0.1:80:80"

docker-compose ne dispose d'aucune capacité spéciale pour déduire quelle interface réseau utiliser en fonction du réseau de base. Vous devez spécifier l'adresse IP unique à utiliser dans chaque fichier de composition, et cette adresse IP doit correspondre à une interface réseau sur votre hôte. Pour un ordinateur de développeur, cette adresse IP peut changer car DHCP donne de nouvelles adresses à l'ordinateur portable/poste de travail.

En raison de la difficulté à mettre en œuvre votre objectif, la plupart d'entre eux mapperaient différents ports de l'hôte vers différents conteneurs. Par conséquent, 13307: 3307 pour le conteneur a, 23307: 3307 pour le conteneur b, 33307: 3307 pour le conteneur c, ou tout autre schéma de numérotation approprié pour vous. Et lorsque vous traitez avec du trafic HTTP, il est souvent logique d'utiliser un proxy inverse tel que traefik.

3
BMitch