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

99

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

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 beginnt ohne Fehler. Und Docker 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

Wenn ich jedoch versuche, eine Verknüpfung zu den laufenden Containern eines anderen Containers 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?

Erwachendes Byte
quelle

Antworten:

196

Ok, habe die Antwort darauf gefunden. 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 einen Namen basierend auf dem „Projektnamen“, der auf dem Namen des Verzeichnisses basiert, in dem es sich befindet. Sie können den Projektnamen entweder mit dem Flag --project-name oder der Umgebungsvariablen COMPOSE_PROJECT_NAME überschreiben . Vernetzung in Compose

Der richtige Weg, um auf diese Container zu verlinken, ist also

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net myapp_default worker 
Erwachendes Byte
quelle
9
Für diejenigen, die es nicht bemerkt haben, müssen Sie das --netvor den Befehl stellen. Ich bin auf dieses Problem gestoßen, als ich versucht habe, das offizielle Redis Docker-Image auszuführen.
Mistertee
3
Ich musste das Flag --network anstelle des Flags --net verwenden. Verwenden Sie es zu Beginn des Befehls run. Ich hoffe das hilft. Eine Referenz finden Sie hier: docs.docker.com/engine/reference/run/#network-settings .
Erizo
11

Mein Befehl, Links auszuführen

docker run --network=YOUR_NETWORK --link SERVICE -t -i app command
Gabriel Borges Oliveira
quelle
2

Wenn Sie Service Definition Version 2 und höher verwenden, docker-composewird ein benutzerdefiniertes Netzwerk erstellt. Die Namensauflösung in einem benutzerdefinierten Netzwerk funktioniert über den eingebetteten Docker-DNS-Server. Hier ist ein verwandtes Zitat aus der 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 anhand seines Containernamens anpingen kann.

Container sind auch für Netzwerk-Aliase verfügbar, die docker-composeerstellt werden. Es kann durch Befehl wie folgt überprüft werden:

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

Es wird gedruckt ["db","$CONTAINER_ID"].

Das Bereitstellen von Links mit --linkhat keine Auswirkungen auf vorhandene benutzerdefinierte Netzwerke. Sie können sicherstellen und schauen /etc/hosts, welche nicht die entsprechenden Zeilen haben.

Somit ist der folgende Befehl ausreichend:

docker run -it --net myapp_default worker
saaj
quelle