2016-11-05 2 views
2

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.

Antwort

4

Wenn Sie Ports wie diesen binden '9002:6379', sagen Sie Docker, Datenverkehr von localhost:9002 ->redis:6379 weiterzuleiten. Deshalb ist diese von Ihrer Host-Maschine funktioniert:

redis-cli -h localhost -p 9002 -n 0 

Wenn jedoch Behälter miteinander reden, sie sind alle mit dem gleichen Netzwerk verbunden standardmäßig (die Docker Brücke oderdocker0). Standardmäßig können Container in diesem Netzwerk frei miteinander kommunizieren, ohne dass Ports geöffnet werden müssen. In diesem Netzwerk überwacht Ihr Container redis den Verkehr auf seinem üblichen Port (6379), Host ist überhaupt nicht beteiligt. Deshalb funktioniert Ihre Container-zu-Container-Kommunikation unter 6379.

+0

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

+0

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

Verwandte Themen