web-dev-qa-db-ja.com

複数のdocker-composeプロジェクト間のコミュニケーション

2つの異なるフォルダに2つの別々のdocker-compose.ymlファイルがあります。

  • 〜/ front/docker-compose.yml
  • 〜/ api/docker-compose.yml

frontのコンテナーがapiのコンテナーにリクエストを送信できることを確認するにはどうすればよいですか?

特定のIPアドレスをこのコンテナーに割り当てることができるように、--default-gatewayオプションを個々のコンテナーにdocker runを使用して設定できることはわかっていますが、docker-composeを使用する場合はこのオプションは使用できないようです。

現在私は最終的にdocker inspect my_api_container_idをやって出力のゲートウェイを見ています。それはうまくいきますが、問題はこのIPがランダムに割り当てられているということです、それで私はそれに頼ることができません。

そのため、この質問の別の形式は、

  • Docker-composeを使って特定のコンテナに固定IPアドレスを割り当てることはできますか?

しかし、最終的に私が見ているのは以下のとおりです。

  • 2つの異なるdocker-composeプロジェクトはどのようにして互いに通信できますか?
147
Jivan

あなたはあなたがお互いに話し合いたいコンテナが同じネットワーク上にあることを確認する必要があります。ネットワークは一流のdocker構文であり、構成するためのものではありません。

# 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

注:アプリのネットワークには「プロジェクト名」に基づいた名前が付けられます。これは、それが存在するディレクトリの名前に基づいています。この場合、プレフィックスfront_が追加されました

それから彼らはサービス名を使用して互いに話すことができます。 frontからping apiをすることができ、その逆も可能です。

199
johnharris85

@ johnharris85のすばらしい答えにちょっとだけ触れて、docker composeファイルを実行しているときには "default"ネットワークが作成されるので、それを外部ネットワークとして他のcomposeファイルに追加することができます。

# 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

私にとって最初のdocker-composeファイルを所有しておらず、それと通信したいので、このアプローチがより適していました。

54
Tal Joffe

アップデート:作成ファイルバージョン3.5現在:

これは今動作します:

version: "3.5"
services:
  proxy:
    image: hello-world
    ports:
      - "80:80"
    networks:
      - proxynet

networks:
  proxynet:
    name: custom_network

docker-compose up -dは、 'custom_network'というネットワークに参加します。存在しない場合は作成されます。

root@ubuntu-s-1vcpu-1gb-tor1-01:~# docker-compose up -d
Creating network "custom_network" with the default driver
Creating root_proxy_1 ... done

今、あなたはこれを行うことができます:

version: "2"
services:
  web:
    image: hello-world
    networks:
      - my-proxy-net
networks:
  my-proxy-net:
    external:
      name: custom_network

これにより、外部ネットワーク上にあるコンテナが作成されます。

私はまだドキュメントに参考文献を見つけることができませんが、それはうまくいきます!

45
cstrutton

apiのすべてのコンテナは、次の設定でfrontデフォルトネットワークに参加できます。

# api/docker-compose.yml

...

networks:
  default:
    external:
      name: front_default

Docker compose guideを参照してください。 既存のネットワークを使用する (下部を参照)

22
dedek

これまでの投稿情報は正しいですが、コンテナをリンクする方法についての詳細はありません。「external_links」として接続する必要があります。

この例があなたにもっと明確になることを願っています:

  • 2つのサービス(svc11とsvc12)を持つapp1/docker-compose.ymlと、さらに2つのサービス(svc21とsvc22)を持つapp2/docker-compose.ymlがあり、交差して接続する必要があるとします。

  • svc11はsvc22のコンテナに接続する必要があります

  • svc21はsvc11のコンテナに接続する必要があります。

そのため、設定は次のようになります。

これは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

これは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

Compose 1.18(spec 3.5)以降、必要なすべてのCompose YAMLファイルに独自のカスタム名を使用してデフォルトネットワークを上書きすることができます。それはそれらに以下を追加するのと同じくらい簡単です:

networks:
  default:
    name: my-app

上記はversion3.5に設定されていることを前提としています(4+で廃止予定でない場合は上記を参照)。

他の答えも同じことを示しています。これは簡単な要約です。

3
emyller

次を使用して、それらを同時に構成することにより、すべてのコンテナが同じネットワークにdocker-compose 'されるようにします。

docker compose --file ~/front/docker-compose.yml --file ~/api/docker-compose.yml up -d
1
Nauraushaun

別のdocker-composeネットワークを使用するには、これらを行うだけです(docker-compose間でネットワークを共有するため):

  1. up -dで最初のdocker-composeプロジェクトを実行します
  2. 最初のdocker-composeのネットワーク名を検索するには、docker network ls(ルートディレクトリプロジェクトの名前が含まれます)
  3. 次に、2番目のdocker-composeファイルで、この構造でその名前を使用します。

2番目の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