2016-08-04 38 views
0

Ich habe ein paar Probleme mit Docker und cURL.Docker: Curl Fehler beim Versuch, App in demselben Container zu kontaktieren

Ich habe ein Docker-compose Behälter wie folgt festgelegt:

app: 
    image: busybox 
    volumes: 
    - /home/ben/dev/dummy/www/:/data/www/ 
    - /home/ben/dev/dummy/logs/:/data/logapache/ 
    - /home/ben/dev/dummy/flux-entrants/:/data/flux-entrants/ 
nginx: 
    image: docker.dummy.fr/nginx 
    volumes_from: 
    - app 
    ports: 
    - 80:80 
    links: 
    - php 
php: 
    image: docker.dummy.fr/actus-php 
    volumes_from: 
    - app 
    ports: 
    - 9000:9000 
    links: 
    - db 
    - nosql 
db: 
    image: docker.dummy.fr/mysql-5.6 
    environment: 
    MYSQL_ROOT_PASSWORD: root 
nosql: 
    image: docker.dummy.fr/lp-nosql 
    ports: 
    - "9200:9200" 

Es gibt auch extra_hosts Richtlinie, die ich hier aus Gründen der Vertraulichkeit entfernt haben, aber die Gastgeber in nginx auch konfiguriert sind (abgebildet auf Port 80 von natürlich) und in den Containern/etc/hosts

Also sind die nginx, php, mysql und elasticsearch alle in separaten Containern. Der Nginx-Container ist mit dem PHP-Container verbunden, der mit den anderen beiden verknüpft ist. Das funktioniert ganz gut, und vor allem kein Problem.

Innerhalb dieses Behälters Ich betreiben zwei Web-Anwendungen, wie mit den zusätzlichen Hosts gesehen: eine Frontend-Client (Symfony 2.8) und eine Backend API (auch Symfony 2.8).

Jetzt zum Problem.

Wenn ich versuche, den API App von außerhalb des php Container, in der Regel Postman oder cURL cli von meinem Terminal auf meinem Linux oder cURL vom nginx Behälter, kein Problem zu kontaktieren.

Aber wenn die Front App (im selben Container) versucht, die API App oder zu kontaktieren, wenn ich aus dem Inneren des php Behälter zu locken versuchen, erhalte ich cURL Fehler "Verbindung abgelehnt". Der ausführliche Modus zeigt, dass der Header nicht einmal gesendet wird.

Ich dachte, es wäre ein Port-Mapping-Problem, aber das Ändern der Ports, das Öffnen neuer Ports und der Versuch, eine Verbindung über diese Ports herzustellen, funktioniert auch nicht.

Ich versuchte es über Port 9000 zu kontaktieren (verwendet für Nginx Upstream und im Docker-Compose geöffnet), aber dann bekomme ich einen anderen Fehler: "Recv Fehler: Verbindung durch Peer zurückgesetzt". Der ausführliche Modus zeigt an, dass Header und Request ordnungsgemäß gesendet werden. Dann trennt der Server die Verbindung.

Hat schon jemand dieses Problem? Wenn ja, wie haben Sie es gelöst? Ich habe hier gesucht, konnte aber nicht das gleiche Problem finden.

Vielen Dank.

EDIT:

ich versuchte, nur zwei getrennte Sätze von Behältern zu machen (ein PHP Container + ein Nginx Behälter) für jede Anwendung (vorne und API), in einem eigenen Behältern separat jede Anwendung der Montage und I hat immer noch das gleiche Problem. Ich kann es einfach nicht verstehen.

+0

Nicht klar, aus welchem ​​Container Sie versuchen, welche Verbindung über cURL herzustellen? Was ist API für Sie? Bitte fügen Sie auch die Ausgabe von docker ps an laufende Container an. – aholbreich

+0

Ich habe vier Container, darunter einen ausschließlich für PHP (namens php im Docker-Compose). In diesem Container leben zwei verschiedene Symfony-Apps: eine Front-Client-App und eine Back-/API-App. Wenn ich die API-App von meinem Terminal, von Postman oder was auch immer außerhalb des PHP-Containers cURL, funktioniert alles. Wenn der Front versucht, die API aufzurufen, oder wenn ich versuche, die API aus dem PHP-Container heraus zu cURL, funktioniert es nicht. – Tiriel

+0

könnten Sie Ihren cURL-Befehl und die Ausgabe von "docker ps" bereitstellen – aholbreich

Antwort

0

Das grundlegende Problem ist, dass Anfragen aus dem php Container sich nicht waren immer aus, damit nicht vorbei durch den nginx Container, die sie richtig versenden konnte.

Wir haben schließlich eine schnelle Lösung durch den Befehl symfony php app/console server:start 0.0.0.0:80 in die API app (innen php Behälter) verwendet wird. Im Grunde haben wir einen zweiten PHP-Server gestartet, der dann für jede App einen Server hat, der ihnen erlaubt, richtig zu kommunizieren.

Ein richtiger Fix und (imo) besseres Design wäre gewesen, die nginx und php Behälter in einen einzigen zu verschmelzen. Es scheint legitim, getrennte Container für den Server und die Datenbanken zu haben, aber getrennte Container für den Server und für den Interpreter führen zu viele Probleme.