webentwicklung-frage-antwort-db.com.de

wie man Docker-Container mit Docker-Compose miteinander verknüpft

Ich muss ein Mongo-Replik-Set mit Docker-Compose einrichten. Für den Replikatsatz müssen sich die Container kennen.

Ich habe versucht in 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
...

Ich erhalte eine zirkuläre Importnachricht. Wenn ich jedoch die Verknüpfung zu dbreplicasetpart1 entferne, kann ich nicht von dbreplicasetpart2 zu dbreplicasetpart1 ..__ pingen. Was ist die Lösung?

23
Michael K.

Aktualisiert für Docker 1.10

Docker 1.10 ermöglicht die Definition von Netzwerken innerhalb der Erstellungsdatei ..__ Hier ist der aktualisierte Code

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

Vorherige Antwort für Docker 1.9

Ab Docker 1.9 besteht die Lösung darin, ein benutzerdefiniertes Netzwerk zu erstellen und an den Befehl docker-compose up zu übergeben.

  1. Erstellen Sie ein Netzwerk docker network create --driver bridge my-net

  2. Verweisen Sie dieses Netzwerk als Umgebungsvariable (${NETWORK}) in den Dateien docker-compose.yml. Z.B:

`` `

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"

`` `

Beachten Sie, dass replica1 in http://replica1:27018 in die IP-Adresse des Dienstes von replica1 (Container) aufgelöst wird. Keine Notwendigkeit, IP-Adressen fest zu codieren; Ein Eintrag für replica1 wird automatisch zum/etc/Host des replica2-Containers hinzugefügt. Dasselbe gilt für den Container "replica1". Docker fügt einen Eintrag für replica2 in seine Datei/etc/Host ein.

  1. Rufen Sie Docker-Compose an und übergeben Sie es an das von Ihnen erstellte Netzwerk NETWORK=my-net docker-compose up -d -f docker-compose.yml

Ich habe ein bridge network erstellt, über dem nur innerhalb eines Knotens (Host) gearbeitet wird. Gut für dev. Wenn zwei Knoten miteinander kommunizieren sollen, müssen Sie ein - Overlay-Netzwerk erstellen. Gleiches Prinzip. Sie übergeben den Netzwerknamen an den Befehl Docker-Compose-Up.

41
Alkaline

Sie sollten das Botschafter-Muster verwenden:

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

Grundsätzlich erstellen Sie eine Zwischenkomponente, die beide überbrückt. Sie können ein Beispiel sehen, das wir mit dem Eureka Discovery-Service von Spring Cloud verwenden:

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"

Der Einfachheit halber habe ich nur die Links kopiert

14
MiguelPuyol

Wir haben uns vorgenommen, die Lösung mit dem Botschafter zu nutzen. Es ist in der Tat die bequemere Lösung. Die Konfiguration, die für uns funktioniert:

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.

Ohne die docker-compose.yml-Datei zu aktualisieren, 

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

Mehr hier

0
Drudge Rajen