668 votes

Communication entre plusieurs projets docker-compose

J'ai deux fichiers docker-compose.yml séparés 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 requêtes à un conteneur dans api ?

Je sais que l'option --default-gateway peut être définie en utilisant docker run pour 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 de docker-compose.

Actuellement, je finis par exécuter docker inspect mon_id_de_conteneur_api et regarder la passerelle dans la sortie. Cela fonctionne, mais le problème est que cette adresse IP est attribuée de manière aléatoire, donc je ne peux pas m'y fier.

Une autre forme de cette question pourrait donc être :

  • Puis-je attribuer une adresse IP fixe à un conteneur particulier en utilisant docker-compose ?

Mais au final, ce que je cherche est :

  • Comment deux projets docker-compose différents peuvent-ils communiquer entre eux ?

10 votes

Je viens de regarder à nouveau aujourd'hui. Les développeurs ont finalement cédé et autorisé un nommage de réseau arbitraire. En utilisant la version de fichier de composition 3.5, vous pouvez spécifier un nom pour le réseau par défaut sous la clé 'networks'. Cela créera un réseau nommé sans le préfixe habituel du nom du projet s'il n'existe pas.

0 votes

Soyez conscient du type de connexion que vous prévoyez d'établir. unidirectionnelle (A->B ou B->A; décrite dans cette question) ou bidirectionnelle A <-> B qui est plus difficile à réaliser (nécessite d'envelopper les fichiers docker avec une logique supplémentaire et de vérifier si le réseau existe ou non en raison de dépendances mutuelles)

776voto

johnharris85 Points 5488

Il vous suffit de vous assurer que les conteneurs que vous voulez faire communiquer sont sur le même réseau. Les réseaux sont une classe de premier ordre dans Docker, et non spécifiques à Compose.

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

...

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

Note : Le réseau de votre application reçoit un nom basé sur le "nom du projet", qui est basé sur le nom du répertoire où il se trouve, dans ce cas un préfixe front_ a été ajouté

Ensuite, ils peuvent communiquer entre eux en utilisant le nom du service. À partir de front, vous pouvez faire ping api et vice versa.

0 votes

Par curiosité, tout ce qui est mappé au port hôte (localhost) serait-il visible de tous les conteneurs ?

0 votes

Et une fois qu'ils sont assurés d'être dans le même réseau, comme vous le suggérez, que faire ensuite? Le conteneur front peut-il avoir un lien vers le conteneur api, par exemple?

0 votes

@JHarris eh bien, si je fais ce que tu suggères, en commençant (up) ~/front déclenche Certains réseaux ont été définis mais ne sont utilisés par aucun service - alors que le démarrage de ~/api déclenche Le service "api" utilise un réseau non défini

295voto

cstrutton Points 2099

MISE À JOUR : À partir de la version 3.5 du fichier compose :

Cela fonctionne maintenant :

version: "3.5"
services:
  proxy:
    image: hello-world
    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éé !

root@ubuntu-s-1vcpu-1gb-tor1-01:~# docker-compose up -d
Creating network "custom_network" with the default driver
Creating root_proxy_1 ... done

Maintenant, vous pouvez faire ceci :

version: "2"
services:
  web:
    image: hello-world
    networks:
      - my-proxy-net
networks:
  my-proxy-net:
    external:
      name: custom_network

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

Je ne trouve encore aucune référence dans la documentation, mais cela fonctionne !

0 votes

Est-ce que vous devez démarrer les deux services dans un ordre spécifique? Pouvez-vous en démarrer un et ensuite l'autre, le premier créera le réseau et le deuxième le rejoindra?

13 votes

Le premier service (proxy ci-dessus) crée le réseau. La syntaxe dans le deuxième exemple le rejoint.

7 votes

@slashdottir Vous ne pouvez pas marquer le réseau comme externe dans le deuxième service et il sera créé s'il n'existe pas encore.

131voto

Tal Joffe Points 1450

Juste une petite addition à la grande réponse de @johnharris85, lorsque vous exécutez un fichier docker compose, un réseau par défaut est créé afin que vous puissiez simplement l'ajouter à l'autre fichier compose en tant que réseau externe :

# front/docker-compose.yml
services:
  front_service:
    ...

...

# api/docker-compose.yml
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 docker-compose et je voulais communiquer avec lui.

0 votes

Je me demande simplement quelle est la bonne façon d'assigner une adresse IP statique à ce réseau externe. J'ai réussi à le faire dans la balise services:, la syntaxe serait networks:, puis en étant imbriqué dans front_default: (supprimer le "-") et ensuite nous imbriquons une adresse IP statique : ipv4_address: '172.20.0.44'

1 votes

Bien que cela soit vrai, il pourrait arriver un moment où cela ne fonctionnera pas. Vous vous basez sur un détail d'implémentation. Qui peut dire qu'ils ne changeront pas la manière dont les réseaux par défaut sont nommés dans une version future. La création d'un réseau nommé explicitement est documentée et sera probablement prise en charge pendant un certain temps.

0 votes

@cstrutton Le nom du réseau par défaut est également documenté.

48voto

dedek Points 471

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

# api/docker-compose.yml

...

networks:
  default:
    external:
      name: front_default

Voir le guide de docker compose : utilisation d'un réseau préexistant (voir en bas de page)

29voto

user2310829 Points 1

Les informations des publications précédentes sont correctes, mais elles ne donnent pas de détails sur la manière de lier les conteneurs, qui doivent être connectés en tant que "external_links".

Voici un exemple qui sera peut-être plus clair pour vous :

  • 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 avez besoin de les 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 ressembler à ceci :

voici app1/docker-compose.yml :

version: '2'
services:
    svc11:
        container_name: container11
        [..]
        networks:
            - default # ce réseau
            - app2_default # réseau externe
        external_links:
            - container22:container22
        [..]
    svc12:
       container_name: container12
       [..]

networks:
    default: # ce réseau (app1)
        driver: bridge
    app2_default: # réseau externe (app2)
        external: true

voici app2/docker-compose.yml :

version: '2'
services:
    svc21:
        container_name: container21
        [..]
        networks:
            - default # ce réseau (app2)
            - app1_default # réseau externe (app1)
        external_links:
            - container11:container11
        [..]
    svc22:
       container_name: container22
       [..]

networks:
    default: # ce réseau (app2)
        driver: bridge
    app1_default: # réseau externe (app1)
        external: true

0 votes

Merci pour cette explication détaillée dans le réseau Docker, c'est très utile. Toute la journée j'ai eu du mal à trouver une explication et une solution adéquates, mais maintenant j'ai compris le concept.

0 votes

Oui il le fait. J'utilise cette configuration de 2 à 3.7

1 votes

"Links" est devenu un concept Docker obsolète une fois que les réseaux Docker ont été introduits et que la version 2 du fichier Compose les a rendus disponibles. Si vous avez une option external_links: comme suggéré dans cette réponse, il est probablement sûr de la supprimer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X