196 votes

Communication entre plusieurs projets composés par docker

J'ai deux distincts docker-compose.yml fichiers dans des dossiers différents:

  • ~/avant/panneau-composer.yml
  • ~/api/docker-composer.yml

Comment puis-je m'assurer que les conteneurs en front peut envoyer des requêtes à un conteneur en api?

Je sais qu' --default-gateway option peut être définie à l'aide de docker run pour un récipient individuel, ainsi qu'une adresse IP peut être attribuée à ce conteneur, mais il semble que cette option n'est pas disponible lors de l'utilisation d' docker-compose.

Actuellement, j'ai fini par faire un docker inspect my_api_container_id et de regarder la passerelle à la sortie. Il fonctionne, mais le problème est que cette adresse IP est attribué au hasard, donc je ne peux pas compter sur elle.

Une autre forme de cette question pourrait donc être:

  • Puis-je attribuer une adresse IP fixe à un conteneur à l'aide de docker-composer?

Mais à la fin ce que je suis à la recherche après:

  • Comment pouvez-deux docker-composer les projets de communiquer les uns avec les autres?

254voto

johnharris85 Points 5488

Vous devez simplement vous assurer que les conteneurs avec lesquels vous souhaitez parler 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 front vous pouvez faire ping api et vice versa.

64voto

Tal Joffe Points 1450
<p>Juste un petit plus à la grande réponse de @johnharris85, lorsque vous exécutez un docker composer des fichiers, un " <code></code> " réseau est créé, donc vous pouvez juste l’ajouter à l’autre fichier de composition comme un réseau externe :<pre><code></code></pre><p>...</p><pre><code></code></pre><p>Pour moi, cette approche était plus adaptée car je ne possédait pas le premier fichier docker-compose et je voulais communiquer avec lui.</p></p>

58voto

cstrutton Points 2099
<p>Mise à jour : à partir de la version 3.5 du fichier nouveau message :<p>Cela fonctionne maintenant :</p><pre><code></code></pre><p><code></code>rejoindront un réseau appelé « custom_network ». S’il n’existe pas, il sera créé !</p><p>Maintenant, vous pouvez faire ceci :</p><pre><code></code></pre><p>Cela va créer un conteneur qui sera sur le réseau externe.</p><p>Je ne trouve aucune référence dans les docs encore, mais ça marche !</p></p>

22voto

dedek Points 471
<p>Tous les contenants de <code></code> peuvent se joindre à la <code></code> réseau <em>par défaut</em> avec la config suivante :<pre><code></code></pre><p>Voir docker composer guide : <a href="http://docs.docker.com/compose/networking/#using-a-pre-existing-network" rel="noreferrer">à l’aide d’un réseau existant de pré</a> (voir en bas)</p></p>

11voto

user2310829 Points 1

Les messages précédents, l'information est correcte, mais il n'a pas de détails sur la façon de lier des conteneurs, qui doit être connecté en tant que "external_links".

Espérons que cet exemple rendre plus clair pour vous:

  • Supposons que vous avez app1/docker-composer.yml, avec deux services (svc11 et svc12), et app2/docker-composer.yml avec deux autres services (svc21 et svc22) et supposons que vous avez besoin pour vous connecter à une traversée de la mode:

  • svc11 besoin de se connecter à svc22 du conteneur

  • svc21 besoin de se connecter à svc11 du conteneur.

Donc, la configuration devrait être comme ceci:

c'est app1/docker-composer.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-composer.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

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