docker-composeによって開始された実行中のコンテナーにリンクできません


99

Dockerコンテナーを使用してローカル開発環境をセットアップしています。docker-compose.ymlは次のようなものです

version: '2'

services:
  db:
    image: mongo:3
  mq:
    image: rabbitmq:3
  api:
    build: .
    image: my_app/api
    ports:
      - "3000:3000"
    links:
      - db
      - mq
    environment:
      - NODE_ENV=development

エラーなしで起動します。そしてDockerは3つの実行中のコンテナをリストします

docker-compose up -d
docker ps

e90e5a8b5d33        my_app/api    "/usr/local/bin/node "   0.0.0.0:3000->3000/tcp               my_app_api_1
42bfcd971b16        mongo:3       "/entrypoint.sh mongo"   27017/tcp                            my_app_db_1
a0685a816c47        rabbitmq:3    "/docker-entrypoint.s"   4369/tcp, 5671-5672/tcp, 25672/tcp   my_app_mq_1

ただし、別のコンテナから実行中のコンテナにリンクしようとすると

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it worker 

エラーが出る

 docker: Error response from daemon: Cannot link to /my_app_mq_1, as it does not belong to the default network.

私も試しました

 docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net default worker 

同じエラー。

では、どのようにdocker-composeによって開始された実行中のコンテナーにリンクできますか?

回答:


196

わかりました、その答えを見つけました。他の誰かが同じ問題に遭遇した場合に備えて、

docker network ls

このコマンドは、すべてのDockerネットワークを一覧表示します。docker-composeを実行すると、docker-composeは新しいネットワークを作成します。私の場合、ネットワークの名前はmyapp_defaultです。

注:アプリのネットワークには、「プロジェクト名」に基づいた名前が付けられます。これは、アプリが存在するディレクトリの名前に基づいています。プロジェクト名は、-project-nameフラグまたはCOMPOSE_PROJECT_NAME環境変数のいずれかでオーバーライドできます。 。Composeのネットワーキング

したがって、これらのコンテナにリンクする正しい方法は

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net myapp_default worker 

9
気付かなかった人のために、あなたは--netコマンドの前に置く必要があります。公式のredis Dockerイメージを実行しようとしたときに、この問題が発生しました。
ミスターティ2017年

3
--netの代わりに--networkフラグを使用する必要がありました。runコマンドの開始時に使用します。これがお役に立てば幸いです。リファレンスはここにあります:docs.docker.com/engine/reference/run/#network-settings
エリゾ2017


2

サービス定義バージョン2以降を使用すると、docker-composeユーザー定義のネットワークが作成されます。ユーザー定義ネットワークでの名前解決は、Docker組み込みDNSサーバーを介して機能します。ドキュメントからの関連する引用は次のとおりです。

Docker組み込みDNSサーバーは、特定の[ユーザー定義]ネットワークに接続されているコンテナーの名前解決を可能にします。つまり、接続されているコンテナは、コンテナ名を使用して、同じネットワーク上の別のコンテナにpingを送信できます。

コンテナは、docker-compose作成するネットワークエイリアスでも使用できます。次のようなコマンドで確認できます。

docker inspect \
  -f '{{json .NetworkSettings.Networks.myapp_default.Aliases}}' my_app_db_1

印刷し["db","$CONTAINER_ID"]ます。

とのリンクを提供し--linkても、既存のユーザー定義ネットワークの場合は効果がありません。/etc/hosts対応する行がないを確認して確認できます。

したがって、次のコマンドで十分です。

docker run -it --net myapp_default worker
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.