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