web-dev-qa-db-de.com

Es kann keine Verknüpfung zu einem laufenden Container erstellt werden, der von Docker-Compose gestartet wurde

Ich richte meine lokale Entwicklungsumgebung mit Docker-Containern ein. Die Docker-compose.yml ist wie folgt

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

Es startet ohne Fehler ..__ und Andockliste listet 3 laufende Container auf

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

Jedoch, wenn ich versuche, von einem anderen Container zu diesen laufenden Containern eine Verbindung herzustellen

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

Ich bekomme einen Fehler

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

Ich habe es auch versucht 

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

Gleicher Fehler.

Wie kann ich also einen Link zu einem laufenden Container erstellen, der von docker-compose gestartet wurde?

76
Awakening Byte

Ok, fand die Antwort darauf. Falls jemand anderes auf dasselbe Problem stößt, tun Sie es einfach 

docker network ls

Dieser Befehl listet alle Docker-Netzwerke auf. Docker-Compose erstellt ein neues Netzwerk, wenn Sie Docker-Compose ausführen. In meinem Fall heißt das Netzwerk myapp_default.

Hinweis: Das Netzwerk Ihrer App erhält basierend auf dem "Projektnamen" einen Namen, der auf dem Namen des Verzeichnisses basiert, in dem sich die App befindet. Sie können den Projektnamen entweder mit dem Flag --project-name oder der Umgebungsvariable COMPOSE_PROJECT_NAME überschreiben . Vernetzung in Compose

Die korrekte Verbindung zu diesen Containern ist also

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

mein Befehl zum Ausführen von Links

docker run --network=YOUR_NETWORK --link SERVICE -t -i app command

Wenn Sie die Service-Definitionsversion 2 und mehr verwenden, erstellt docker-compose ein benutzerdefiniertes Netzwerk. Die Namensauflösung in einem benutzerdefinierten Netzwerk funktioniert über einen eingebetteten Docker-DNS-Server. Hier ein entsprechendes Zitat aus Dokumentation :

Der eingebettete Docker-DNS-Server ermöglicht die Namensauflösung für Container, die mit einem bestimmten [benutzerdefinierten] Netzwerk verbunden sind. Dies bedeutet, dass jeder verbundene Container einen anderen Container im selben Netzwerk über seinen Containernamen anpingen kann.

Container sind auch über Netzwerkaliasnamen verfügbar, die docker-compose erstellt. Es kann wie folgt mit einem Befehl überprüft werden:

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

Es druckt ["db","$CONTAINER_ID"].

Das Bereitstellen von Links mit --link hat im Falle eines vorhandenen benutzerdefinierten Netzwerks keine Auswirkungen. Sie können sichergehen und sich /etc/hosts anschauen, der die entsprechenden Zeilen nicht enthält. 

Somit ist der folgende Befehl ausreichend:

docker run -it --net myapp_default worker
0
saaj