Communication entre plusieurs projets de docker-compose

J’ai deux fichiers docker-compose.yml dans deux dossiers différents:

  • ~ / front / docker-compose.yml
  • ~ / api / docker-compose.yml

Comment puis-je m’assurer qu’un conteneur à l’ front peut envoyer des requêtes à un conteneur dans api ?

Je sais que l’ --default-gateway peut être définie à l’aide de docker run pour un conteneur individuel, afin qu’une adresse IP spécifique puisse être affectée à ce conteneur, mais il semble que cette option ne soit pas disponible lors de l’utilisation de docker-compose .

Actuellement, je docker inspect my_api_container_id par faire un docker inspect my_api_container_id et regarder la passerelle dans la sortie. Cela fonctionne, mais le problème est que cette adresse IP est atsortingbuée au hasard, donc je ne peux pas compter sur elle.

Une autre forme de cette question pourrait donc être:

  • Puis-je atsortingbuer 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 dockers différents peuvent-ils communiquer entre eux?

Il vous suffit de vous assurer que les conteneurs que vous souhaitez communiquer se trouvent sur le même réseau. Les réseaux sont une construction de docker de première classe et non spécifique à la composition.

 # front/docker-compose.yml version: '2' services: front: ... networks: - some-net networks: some-net: driver: bridge 

 # api/docker-compose.yml version: '2' services: api: ... networks: - front_some-net networks: front_some-net: external: true 

Ils peuvent ensuite se parler en utilisant le nom du service. De l’ front vous pouvez faire un ping api et vice versa.

Juste un petit ajout à la bonne réponse de @ johnharris85, lorsque vous exécutez un fichier de composition de docker, un réseau ” default ” est créé pour que vous puissiez simplement l’append à l’autre fichier de composition en tant que réseau externe:

 # front/docker-compose.yml version: '2' services: front_service: ... 

 # api/docker-compose.yml version: '2' services: api_service: ... networks: - front_default networks: front_default: external: true 

Pour moi, cette approche était plus adaptée car je ne possédais pas le premier fichier de composition de docker et souhaitais communiquer avec lui.

UPDATE: à partir de la version 3.5 du fichier de composition:

Cela fonctionne maintenant:

 version: "3.5" services: proxy: image: user/image:tag ports: - "80:80" networks: - proxynet networks: proxynet: name: custom_network 

docker-compose up -d rejoindra un réseau appelé ‘custom_network’. S’il n’existe pas, il sera créé!

Maintenant, vous pouvez le faire:

 version: "2+" services: web: image: myweb:latest networks: - my-proxy-net networks: my-proxy-net: external: name: custom_network 

Cela créera un conteneur qui sera sur le réseau externe.

Je ne trouve pas encore de référence dans les docs mais ça marche!

Tous les conteneurs d’ api peuvent rejoindre le réseau par défaut avec la configuration suivante:

 # api/docker-compose.yml ... networks: default: external: name: front_default 

Voir le guide de composition de docker: en utilisant un réseau préexistant (voir en bas)

Les informations sur les publications précédentes 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 “external_links”.

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 services supplémentaires (svc21 et svc22) et supposez que vous deviez vous connecter de manière croisée:

  • svc11 doit se connecter au conteneur de svc22

  • svc21 doit se connecter au conteneur de svc11.

Donc, la configuration devrait être comme ceci:

c’est app1 / docker-compose.yml:

 version: '2' services: svc11: container_name: container11 [..] networks: - default # this network - app2_default # external network external_links: - container22:container22 [..] svc12: container_name: container12 [..] networks: default: # this network (app1) driver: bridge app2_default: # external network (app2) external: true 

c’est app2 / docker-compose.yml:

 version: '2' services: svc21: container_name: container21 [..] networks: - default # this network (app2) - app1_default # external network (app1) external_links: - container11:container11 [..] svc22: container_name: container22 [..] networks: default: # this network (app2) driver: bridge app1_default: # external network (app1) external: true 

Depuis Compose 1.18 (spec 3.5), vous pouvez simplement remplacer le réseau par défaut en utilisant votre propre nom personnalisé pour tous les fichiers Composer YAML dont vous avez besoin. C’est aussi simple que de leur append ce qui suit:

 networks: default: name: my-app 

Ce qui précède suppose que vous avez la version définie sur 3.5 (ou supérieur si elles ne le déprécient pas dans 4+).

D’autres réponses ont indiqué la même chose. Ceci est un résumé simplifié.

Je m’assurerais que tous les conteneurs sont docker-compose d sur le même réseau en les composant ensemble en même temps, en utilisant:

 docker compose --file ~/front/docker-compose.yml --file ~/api/docker-compose.yml up -d