web-dev-qa-db-fra.com

comment lier un conteneur docker entre eux avec docker-compose

Je dois configurer un jeu de répliques Mongo avec docker-compose. Pour le jeu de répliques, les conteneurs doivent se connaître.

J'ai essayé en docker-compose.yml

    dbreplicasetpart1:
      image: mongo:2.6.8
      expose:
        - '27018'
      links:
        - replicasetpart2
        - replicasetpart3
      cap_add:
        - NET_ADMIN

    dbreplicasetpart2:
      image: mongo:2.6.8
      links:
        - replicasetpart1
        - replicasetpart3
      expose:
        - '27019'
      cap_add:
        - NET_ADMIN
...

Je reçois un message d'importation circulaire. Mais si je supprime le lien retour vers dbreplicasetpart1, je ne peux pas cingler de dbreplicasetpart2 à dbreplicasetpart1 . Quelle est la solution?

23
Michael K.

Mise à jour pour Docker 1.10

Docker 1.10 permet la définition de réseaux dans le fichier de composition ..__ Voici le code mis à jour

version: "2"

services:
  replica1:
    image: mongo:2.6.8
    container_name: replica1
    networks:
      - my-net
    ports:
      - "27018"
    environment:
      REPLICA2_URL: "http://replica2:27019"
  replica2:
    image: mongo:2.6.8
    container_name: replica2
    networks:
      - my-net
    ports:
      - "27019"
    environment:
      REPLICA1_URL: "http://replica1:27018"

networks:
  my-net:
    driver: bridge

Réponse précédente pour Docker 1.9

À partir de Docker 1.9, la solution consiste à créer un réseau personnalisé et à le transmettre à la commande docker-compose up.

  1. Créer un réseau docker network create --driver bridge my-net

  2. Référencez ce réseau en tant que variable d'environnement (${NETWORK}) dans les fichiers docker-compose.yml. Par exemple:

`` `

replica1:
  image: mongo:2.6.8
  container_name: replica1
  net: ${NETWORK}
  ports:
    - "27018"
  environment:
    REPLICA2_URL: "http://replica2:27019"

replica2:
  image: mongo:2.6.8
  container_name: replica2
  net: ${NETWORK}
  ports:
    - "27019"
  environment:
    REPLICA1_URL: "http://replica1:27018"

`` `

Notez que replica1 dans http://replica1:27018 sera résolu en adresse ip du service réplica1 (conteneur). Pas besoin de coder en dur les adresses IP; Une entrée pour replica1 est automatiquement ajoutée au répertoire/etc/Host du conteneur replica2. Il en va de même pour le conteneur replica1. Docker ajoutera une entrée pour replica2 dans son fichier/etc/Host.

  1. Appelez docker-compos, en transmettant le réseau que vous avez créé NETWORK=my-net docker-compose up -d -f docker-compose.yml

J'ai créé un pont pont ci-dessus qui ne fonctionne que dans un seul nœud (hôte). Bon pour dev. Si vous avez besoin que deux nœuds se parlent, vous devez créer un réseau en superposition. Même principe cependant. Vous transmettez le nom du réseau à la commande docker-compos up.

41
Alkaline

Vous devriez utiliser le motif ambassadeur:

https://docs.docker.com/engine/admin/ambassador_pattern_linking/

Fondamentalement, vous créez un composant intermédiaire qui relie les deux. Vous pouvez voir un exemple que nous utilisons avec le service de découverte Eureka de Spring Cloud:

ambassador:
  image: cpuguy83/docker-grand-ambassador
  volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
  command: "-name eureka_1 -name eureka2_1 "

eureka:
  links:
    - "ambassador:eureka2"

eureka2:
  links:
    - "ambassador:eureka"

Pour simplifier, je n'ai copié que les liens

14
MiguelPuyol

Nous avons pensé utiliser la solution avec l'ambassadeur. C’est bien la solution la plus confortable ... La configuration qui nous convient:

amba1:
  image: cpuguy83/docker-grand-ambassador
  volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
  command: "-name cucumber_dbreplicasetpart1_1"

amba2:
  image: cpuguy83/docker-grand-ambassador
  volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
  command: "-name cucumber_dbreplicasetpart2_1"

amba3:
  image: cpuguy83/docker-grand-ambassador
  volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
  command: "-name cucumber_dbreplicasetpart3_1"

dbreplicasetpart1:
  image: 'mongo:2.6.8'
  hostname: dbreplicasetpart1
  command: >
    bash -c
    '
      mongod --fork --logpath mongo.log --smallfiles --replSet rs1
      echo "
        printjson(
          rs.initiate(
            {
              _id : \"rs1\",
              members : [
                {_id : 0, Host : \"dbreplicasetpart1:27017\"},
                {_id : 1, Host : \"dbreplicasetpart2:27017\"},
                {_id : 2, Host : \"dbreplicasetpart3:27017\"},
              ]
            }
          )
        );
      " | mongo;
      tail -f mongo.log
    '
  links:
    - "amba2:dbreplicasetpart2"
    - "amba3:dbreplicasetpart3"

dbreplicasetpart2:
  image: 'mongo:2.6.8'
  hostname: dbreplicasetpart2
  command: >
    bash -c
    '
      mongod --fork --logpath mongo.log --smallfiles --replSet rs1
      echo "
        printjson(
          rs.initiate(
            {
              _id : \"rs1\",
              members : [
                {_id : 0, Host : \"dbreplicasetpart1:27017\"},
                {_id : 1, Host : \"dbreplicasetpart2:27017\"},
                {_id : 2, Host : \"dbreplicasetpart3:27017\"},
              ]
            }
          )
        );
      " | mongo;
      tail -f mongo.log
    '
  links:
    - "amba1:dbreplicasetpart1"
    - "amba3:dbreplicasetpart3"

dbreplicasetpart3:
  image: 'mongo:2.6.8'
  hostname: dbreplicasetpart3
  command: >
    bash -c
    '
      mongod --fork --logpath mongo.log --smallfiles --replSet rs1
      echo "
        printjson(
          rs.initiate(
            {
              _id : \"rs1\",
              members : [
                {_id : 0, Host : \"dbreplicasetpart1:27017\"},
                {_id : 1, Host : \"dbreplicasetpart2:27017\"},
                {_id : 2, Host : \"dbreplicasetpart3:27017\"},
              ]
            }
          )
        );
      " | mongo;
      tail -f mongo.log
    '
  links:
    - "amba1:dbreplicasetpart1"
    - "amba2:dbreplicasetpart2"
0
Michael K.

Sans mettre à jour le fichier docker-compose.yml

docker network connect docker-compose-network-you-want-to-connect conatianer-name-from-another-docker-compose

Plus ici

0
Drudge Rajen