web-dev-qa-db-fra.com

Communication entre plusieurs projets composés par docker

J'ai deux fichiers docker-compose.yml 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 l'option --default-gateway peut être définie à l'aide de docker run pour un conteneur individuel, de sorte 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 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, je ne peux donc pas compter dessus.

Une autre forme de cette question pourrait donc être:

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

Mais à la fin, je m'occupe de:

  • Comment deux projets de composition de dock différents peuvent-ils communiquer l'un avec l'autre?
167
Jivan

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

Remarque: le réseau de votre application se voit attribuer un nom basé sur le "nom du projet", lequel est basé sur le nom du répertoire dans lequel elle réside. Dans ce cas, un préfixe front_ a été ajouté.

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

225
johnharris85

Juste une petite addition à l'excellente réponse de @ johnharris85, lorsque vous exécutez un fichier de composition de docker, un réseau "default" est créé afin que vous puissiez simplement l'ajouter à 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 docker-compose et souhaitais communiquer avec lui.

60
Tal Joffe

UPDATE: à partir de la version de fichier composée 3.5:

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 sera sur le réseau externe.

Je ne trouve pas encore de référence dans la documentation mais cela fonctionne!

48
cstrutton

Tous les conteneurs de api peuvent rejoindre le réseau front 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)

22
dedek

Les informations sur les publications précédentes sont correctes, mais elles ne permettent pas de savoir comment lier les conteneurs, qui doivent être connectés en tant que "liens_externes".

J'espère que cet exemple vous aidera à mieux comprendre:

  • 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 supposons que vous deviez vous connecter de manière croisée:

  • svc11 doit se connecter au conteneur de svc22

  • svc21 doit se connecter au conteneur 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
8
Daniel Blanco

Depuis Compose 1.18 (spéc. 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:

networks:
  default:
    name: my-app

Ce qui précède suppose que vous avez version défini sur 3.5 (ou supérieur si cela n’est pas déprécié dans 4+).

D'autres réponses ont pointé le même; Ceci est un résumé simplifié.

3
emyller

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
1
Nauraushaun

Pour utiliser un autre réseau docker-compose, procédez comme suit (pour partager des réseaux entre docker-compose):

  1. Exécutez le premier projet de composition de docker par up -d
  2. Recherchez le nom de réseau du premier groupe composé à l’aide de: docker network ls (Il contient le nom du projet de répertoire racine)
  3. Ensuite, utilisez ce nom par cette structure en bas dans le deuxième fichier docker-compose.

deuxième docker-compose.yml

version: '3'
services:
  service-on-second-compose:  # Define any names that you want.
    .
    .
    .
    networks:
      - <put it here(the network name that comes from "docker network ls")>

networks:
  - <put it here(the network name that comes from "docker network ls")>:
    external: true
0
Ali Hallaji
version: '2'
services:
  bot:
    build: .
    volumes:
      - '.:/home/node'
      - /home/node/node_modules
    networks:
      - my-rede
    mem_limit: 100m
    memswap_limit: 100m
    cpu_quota: 25000
    container_name: 236948199393329152_585042339404185600_bot
    command: node index.js
    environment:
      NODE_ENV: production
networks:
  my-rede:
    external:
      name: name_rede_externa
0
Pedro