J'ai deux docker-compose.yml
fichiers distincts dans deux dossiers différents:
~/front/docker-compose.yml
~/api/docker-compose.yml
Comment puis-je m'assurer qu'un conteneur dans front
peut envoyer des demandes à un conteneur dans api
?
Je sais que cette --default-gateway
option peut être définie à l'aide docker run
d'un conteneur individuel, afin qu'une adresse IP spécifique puisse être attribuée à ce conteneur, mais il semble que cette option ne soit pas disponible lors de l'utilisation docker-compose
.
Actuellement, je finis par faire un docker inspect my_api_container_id
et regarde la passerelle dans la sortie. Cela fonctionne, mais le problème est que cette adresse IP est attribuée au hasard, donc je ne peux pas me fier à elle.
Une autre forme de cette question pourrait donc être:
- Puis-je attribuer une adresse IP fixe à un conteneur particulier en utilisant docker-compose?
Mais à la fin ce que je cherche c'est:
- Comment deux projets de composition de docker différents peuvent-ils communiquer entre eux?
Réponses:
Il vous suffit de vous assurer que les conteneurs dont vous souhaitez vous entretenir se trouvent sur le même réseau. Les réseaux sont une construction de docker de première classe et ne sont pas spécifiques à la composition.
...
Ils peuvent ensuite se parler en utilisant le nom du service. De
front
vous pouvez faireping api
et vice versa.la source
name
propriété, ce qui désactivera l'ajout automatique avec le nom du projet. Ensuite, l'un ou l'autre projet peut utiliser ce réseau et le créer automatiquement s'il n'existe pas encore.Juste un petit ajout à la grande réponse de @ johnharris85, lorsque vous exécutez un fichier de composition docker, un "
default
" réseau est créé afin que vous puissiez simplement l'ajouter à l'autre fichier de composition en tant que réseau externe:...
Pour moi, cette approche était plus adaptée car je ne possédais pas le premier fichier Docker-compose et je voulais communiquer avec lui.
la source
services:
balise, la sintax seraitnetworks:
alors imbriquéefront_default:
(supprimez le "-") puis nous imbriquons une IP statique:ipv4_address: '172.20.0.44'
MISE À JOUR: Depuis la version 3.5 du fichier de composition:
Cela fonctionne maintenant:
docker-compose up -d
rejoindra un réseau appelé 'custom_network'. S'il n'existe pas, il sera créé!Maintenant, vous pouvez le faire:
Cela créera un conteneur qui sera sur le réseau externe.
Je ne trouve pas encore de référence dans la documentation mais cela fonctionne!
la source
Tous les conteneurs de
api
peuvent rejoindre le réseaufront
par défaut avec la configuration suivante:Voir le guide de composition de docker: utiliser un réseau préexistant (voir en bas)
la source
Les informations des articles précédents sont correctes, mais elles ne contiennent pas de détails sur la façon de lier les conteneurs, qui doivent être connectés en tant que "liens_externes".
J'espère que cet exemple vous rendra plus clair:
Supposons que vous ayez app1 / docker-compose.yml, avec deux services (svc11 et svc12), et app2 / docker-compose.yml avec deux autres services (svc21 et svc22) et supposez que vous devez vous connecter de manière croisée:
svc11 doit se connecter au conteneur de svc22
La configuration devrait donc être comme ceci:
c'est app1 / docker-compose.yml:
c'est app2 / docker-compose.yml:
la source
Depuis Compose 1.18 (spécification 3.5), vous pouvez simplement remplacer le réseau par défaut en utilisant votre propre nom personnalisé pour tous les fichiers Compose YAML dont vous avez besoin. C'est aussi simple que de leur ajouter ce qui suit:
D'autres réponses ont montré la même chose; il s'agit d'un résumé simplifié.
la source
Je m'assurerais que tous les conteneurs sont
docker-compose
connectés au même réseau en les composant ensemble en même temps, en utilisant:la source
link
oudepends_on
d'un conteneur de façade à un conteneur d'api?build path ~/front/api either does not exist or is not accessible
ou avec l'inverse,build path ~/api/front either does not exist or is not accessible
MISE À JOUR: Depuis la version 3.5 du fichier de composition:
J'ai rencontré le problème similaire et je l'ai résolu en ajoutant un petit changement dans l'un de mes projets docker-compose.yml.
Par exemple, nous avons deux api
scoring
etner
.Scoring
api doit envoyer une demande à l'ner
api pour traiter la demande d'entrée. Pour ce faire, ils doivent tous deux partager le même réseau.Remarque: Chaque conteneur possède son propre réseau qui est automatiquement créé au moment de l'exécution de l'application dans Docker. Par exemple, le réseau ner api sera créé comme
ner_default
et le réseau api de notation sera nommé commescoring default
. Cette solution fonctionnera pour la version: '3'.Comme dans le scénario ci-dessus, mon api de notation veut communiquer avec ner api, alors j'ajouterai les lignes suivantes. Ce qui signifie que chaque fois que je crée le conteneur pour ner api, il est automatiquement ajouté au réseau scoring_default.
ner / docker-compose.yml
notation / docker-compose.yml
Nous pouvons voir comment les conteneurs ci-dessus font maintenant partie du même réseau appelé
scoring_default
à l'aide de la commande:la source
Vous pouvez ajouter un
.env
fichier dans tous vos projets contenantCOMPOSE_PROJECT_NAME=somename
.COMPOSE_PROJECT_NAME remplace le préfixe utilisé pour nommer les ressources, car tous vos projets utiliseront
somename_default
comme réseau, ce qui permet aux services de communiquer entre eux comme ils l'étaient dans le même projet.NB: Vous recevrez des avertissements pour les conteneurs "orphelins" créés à partir d'autres projets.
la source
la source
deuxième docker-compose.yml
la source
Une autre option consiste simplement à exécuter le premier module avec la vérification «docker-compose» de l'ip associée au module, et à connecter le deuxième module au réseau précédent comme externe, et à pointer l'IP interne
exemple app1 - nouveau réseau créé dans les lignes de service, marque comme externe: vrai en bas app2 - indique le "nouveau réseau" créé par app1 lorsqu'il monte, marque comme externe: vrai en bas, et défini dans la configuration pour se connecter, l'ip que app1 a dans ce réseau.
Avec cela, vous devriez pouvoir vous parler
* cette façon est juste pour le focus de test local, afin de ne pas faire une configuration trop complexe ** Je sais que c'est très `` patch '' mais fonctionne pour moi et je pense que c'est si simple que d'autres peuvent en profiter
la source
Si vous êtes
Connection refused
en essayant de communiquer entre deux conteneursEt tu veux
api_a
communique avecapi_b
(ou vice versa) sans le même "réseau docker"(exemple ci-dessous)
vous pouvez utiliser "l'hôte" du deuxième conteneur comme IP de votre ordinateur et le port mappé depuis l'intérieur du conteneur Docker. Vous pouvez obtenir l'IP de votre ordinateur avec ce script (à partir de: Trouver des adresses IP locales en utilisant stdlib de Python ):
Exemple:
project_api_a/docker-compose.yml
:à l'intérieur du
api_a
conteneur, vous exécutez l'application Django:manage.py runserver 0.0.0.0:8000
et le deuxième docker-compose.yml d'un autre projet:
project_api_b/docker-compose-yml
:à l'intérieur du
api_b
conteneur, vous exécutez l'application Django:manage.py runserver 0.0.0.0:8001
Et essayer de se connecter du conteneur
api_a
à l'api_b
URL duapi_b
conteneur sera:http://<get_ip_from_script_above>:8001/
Cela peut être particulièrement utile si vous utilisez encore plus de deux (trois ou plus) projets de composition de docker et qu'il est difficile de fournir un réseau commun pour tout cela - c'est une bonne solution de contournement et une bonne solution.
la source