TL; DR: Wie muss ich meinen Wert unter docker-compose.yml
ändern, damit ein Container einen Service eines anderen über einen benutzerdefinierten (Nicht-Standard) nutzen kann Hafen?docker-compose: Verbindung zwischen Containern abgelehnt, aber Dienst vom Host aus erreichbar
Ich habe ein ziemlich allgemeines Setup: Container für eine Web-App (Padrino [Ruby]), Postgres, Redis und ein Warteschlangen-Framework (Sidekiq). Die Web-App wird mit einer benutzerdefinierten Docker-Datei geliefert, die restlichen Dienste stammen entweder aus Standard-Images (Postgres, Redis) oder mounten die Daten aus der Web-App (Sidekiq). Sie sind Verbindungen zusammen über folgende docker-compose.yml
:
version: '2'
services:
web:
build: .
command: 'bundle exec puma -C config/puma.rb'
volumes:
- .:/myapp
ports:
- "9000:3000"
depends_on:
- postgres
- redis
sidekiq:
build: .
command: 'bundle exec sidekiq -C config/sidekiq.yml -r ./config/boot.rb'
volumes:
- .:/myapp
depends_on:
- postgres
- redis
postgres:
image: postgres:9.5
environment:
POSTGRES_USER: my-postgres-user
POSTGRES_PASSWORD: my-postgres-pass
ports:
- '9001:5432'
volumes:
- 'postgres:/var/lib/postgresql/data'
redis:
image: redis
ports:
- '9002:6379'
volumes:
- 'redis:/var/lib/redis/data'
volumes:
redis:
postgres:
Ein wichtiger Punkt ist hier zu bemerken ist, dass ich die Container Dienste am aussetzt auf Nicht-Standard- Ports (9000-9002).
Wenn ich das Setup mit docker-compose up
starte, kommen die Redis und Postgres Container gut, aber die Container für die Webanwendung und Sidekiq schlagen fehl, da sie keine Verbindung zu Redis unter redis:9002
herstellen können. Bemerkenswerterweise das gleiche Setup funktioniert wenn ich 6379 verwenden (die Standard-Redis Port) anstelle von 9002.
docker ps
sieht auch gut afaik:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9148566c2509 redis "docker-entrypoint.sh" Less than a second ago Up About a minute 0.0.0.0:9002->6379/tcp rubydockerpadrino_redis_1
e6d47321c939 postgres:9.5 "/docker-entrypoint.s" Less than a second ago Up About a minute 0.0.0.0:9001->5432/tcp rubydockerpadrino_postgres_1
Was ist noch verwirrender: Ich kann die Redis zugreifen Container vom Host über redis-cli -h localhost -p 9002 -n 0
, aber die Webanwendung und Sidekiq Container können keine Verbindung herstellen.
Ich bin mit dieser Docker-Version auf MacOS: Docker version 1.12.3, build 6b644ec, experimental
Irgendwelche Ideen, was ich falsch mache? Ich würde mich über jeden Hinweis freuen, wie ich mein Setup zum Laufen bringen kann.
Sie haben es geschafft! Vielen Dank für das Zeigen auf den Teil (das Port-Mapping und dass es die Ports an den Host weiterleitet, aber nicht zwischen Containern), die ich bis jetzt missverstanden habe. Jetzt funktioniert es! :) – crn
Das Mapping ist nützlich, wenn Sie mehrere Container haben, die intern auf demselben Port warten und auf Localhost neu zuordnen müssen. Da jeder Container separat ist, ist das in Containern kein Problem. Es gibt auch Einstellungen, bei denen Sie die Container-zu-Container-Kommunikation deaktivieren und auch andere Netzwerke als den Standard erstellen können, mit dem Ihre Container verbunden werden sollen. Denken Sie daran, die Antwort zu akzeptieren, wenn es funktioniert :) – johnharris85