web-dev-qa-db-ja.com

docker-composeを使用してdockerコンテナーを相互にリンクする方法

Docker-composeでmongoレプリカセットをセットアップする必要があります。レプリカセットの場合、コンテナはお互いを認識している必要があります。

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
...

循環インポートメッセージが表示されます。しかし、dbreplicasetpart1へのバックリンクを削除すると、dbreplicasetpart2からdbreplicasetpart1にpingできません。解決策は何ですか?

23
Michael K.

Docker 1.10用に更新

Docker 1.10では、作成ファイル内でネットワークを定義できます。これが更新されたコードです

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

Docker 1.9の以前の回答

Docker 1.9現在、これに対する解決策は、カスタムネットワークを作成し、docker-compose upコマンドに渡すことです。

  1. ネットワークを作成docker network create --driver bridge my-net

  2. Docker-compose.ymlファイルの環境変数(${NETWORK})としてそのネットワークを参照します。例えば:

`` `

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"

`` `

replica1http://replica1:27018は、replica1サービス(コンテナー)のIPアドレスに解決されることに注意してください。 IPアドレスをハードコーディングする必要はありません。 replica1のエントリは、replica2コンテナの/ etc/Hostに自動的に追加されます。 replica1コンテナーについても同様です。 Dockerは/ etc/Hostファイルにreplica2のエントリを追加します。

  1. Docker-composeを呼び出して、作成したネットワークに渡しますNETWORK=my-net docker-compose up -d -f docker-compose.yml

ブリッジネットワークを作成しましたが、これは1つのノード(ホスト)内でのみ機能します。開発者に適しています。 2つのノードを相互に通信させる必要がある場合、オーバーレイネットワークを作成する必要があります。しかし同じ原理。ネットワーク名をdocker-compose upコマンドに渡します。

41
Bernard

アンバサダーパターンを使用する必要があります。

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

基本的に、両方をブリッジする中間コンポーネントを作成します。 Spring CloudのEurekaディスカバリサービスで使用する例を見ることができます。

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"

簡単にするために、リンクのみをコピーしました

14
MiguelPuyol

このソリューションをアンバサダーで使用することがわかりました。それは確かにより快適なソリューションです。私たちのために働く構成:

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.

docker-compose.ymlファイルを更新せずに、

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

もっと こちら

0
Drudge Rajen