Docker für Windows: Container ist nicht über localhost erreichbar

JR Cologne

Administrator
Teammitglied
Guten Abend,

ich verzweifel gerade daran, dass Docker ausgerechnet bei der Kombination aus PHP und Apache Probleme zu haben scheint. :D
Ich habe das 101-Tutorial für Docker gemacht und in diesem Rahmen an einer Node.js-Anwendung gearbeitet und alles hat einwandfrei funktioniert.

Im Anschluss wollte ich dann anfangen, für ein Projekt eine Umgebung mit PHP und Apache einzurichten.
Dabei bin ich im Grunde genau dem Tutorial gefolgt: https://bitpress.io/simple-approach-using-docker-with-php/

Was ist nun? Wenn ich mittels docker run -dp 80:80 myapp den Container starte, kann ich auf diesen nicht über localhost zugreifen (Chrome: err_connection_refused).
Irgendwie kommt mir dieses Problem bekannt vor. Ich glaube, daran habe ich mir schon mal die Zähne ausgebissen... :rolleyes:

Wenn ich übrigens jedoch einen beliebigen anderen Port wähle (z.B. 8080), bekomme ich stattdessen in Chrome einen err_ssl_protocol_error und die Logs des Containers zeigen ungefähr sowas in die Richtung:
Code:
172.17.0.1 - - [21/Mar/2020:21:43:06 +0000] "GET / HTTP/1.1" 301 501 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
172.17.0.1 - - [21/Mar/2020:21:43:06 +0000] "GET /robots.txt HTTP/1.1" 301 519 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
172.17.0.1 - - [21/Mar/2020:21:43:06 +0000] "\x16\x03\x01\x02" 400 0 "-" "-"

Es scheint in dem Fall also durchaus was durchzukommen.

Wähle ich hingegen den Standardport 80, taucht auch in den Logs nichts auf.

Mein Dockerfile:
Code:
FROM php:7.4-apache

COPY . /srv/app
COPY .docker/vhost.conf /etc/apache2/sites-available/000-default.conf

RUN chown -R www-data:www-data /srv/app && a2enmod rewrite

vhost.conf
Apache-Konfiguration:
<VirtualHost *:80>
    DocumentRoot /srv/app/public

    <Directory "/srv/app/public">
        AllowOverride all
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>


Hat irgendwer eine Idee, was ich gegen dieses Problem tun kann?
Ich habe unter anderem auch schon ähnliche GitHub-Issues zu dem Thema gefunden. Das ist auf jeden Fall kein neues Problem, wurde angeblich aber schon gefixt.

Schon mal vielen Dank im Voraus! :)

Viele Grüße
JR Cologne
 
Welches OS und Produkt (Docker Engine unter Linux, Docker Desktop oder Docker Toolbox) verwendest du? Unter Linux klappt es, und hier mit Docker Desktop ebenfalls:

1584869809214.png
 
Welches Produkt verwendest du (Docker Engine unter Linux, Docker Desktop oder Docker Toolbox)? Unter Linux klappt es, und hier mit Docker Desktop ebenfalls:

Docker Desktop unter Windows, allerdings mit Linux-Containern. Unter Linux wird man das wahrscheinlich nicht nachvollziehen können, da es, glaube ich, ein Windows-spezifisches Problem ist.

Edit:
Was übrigens neu ist: Plötzlich funktioniert die App aus dem Tutorial auch nicht mehr. Jetzt bekomme ich da ebenfalls den SSL-Fehler.

Edit 2:
Ok, ich bin dumm. :D Zumindest der SSL-Fehler ist wahrscheinlich auf eine unglückliche Verkettung von verschiedenen Umständen zurückzuführen.

Ich habe gerade festgestellt, dass ich in meinem DocumentRoot der PHP-Anwendung ja noch eine .htaccess-Datei liegen habe, die HSTS durchsetzt. Dementsprechend kommt der SSL-Fehler daher, dass ich die ganze Zeit auf https umgeleitet werde und Chrome clientseitig dies dann natürlich auch beibehalten hat, sodass später auch die Node-Anwendung nicht mehr funktionierte.

Festgestellt habe ich dies jetzt durch den Aufruf der Node-App über die localhost-IP 127.0.0.1, der hingegen nämlich funktionierte.

Warum ich weiterhin nicht auf localhost unter Port 80 zugreifen kann, über die IP der Zugriff aber funktioniert, bliebt jedoch ein Rätsel.
 
Zuletzt bearbeitet:
Bevor wir beim Netzwerkproblem weitermachen: Dein Document-Root ist zwar /srv/app/public, aber im Dockerfile wird dein Projekt nach /srv/app kopiert.

Wie sieht die Sache denn aus, wenn du alles nach /srv/app/public kopierst und auch die RUN chmod-Anweisung entsprechend änderst? Kann sein, dass der Verbindungsaufbau nicht klappt, weil du chmod nicht direkt auf den Document-Root anwendest.

Die Anwendung bitte weiterhin als Linux-Container laufen lassen, weil php:7.4-apache ein Linux-Image ist.
 
Bevor wir beim Netzwerkproblem weitermachen: Dein Document-Root ist zwar /srv/app/public, aber im Dockerfile wird dein Projekt nach /srv/app kopiert.

Wie sieht die Sache denn aus, wenn du alles nach /srv/app/public kopierst und auch die RUN chmod-Anweisung entsprechend änderst? Kann sein, dass der Verbindungsaufbau nicht klappt, weil du chmod nicht direkt auf den Document-Root anwendest.

Meine Anwendung ist ja so strukturiert, dass nur der public-Ordner ausgeliefert werden soll, der gesamte Backend-Code usw. aber im übergeordneten Ordner liegt. Das dürfte richtig sein.

Ich glaube, wir haben es jetzt nur noch mit dem Netzwerkproblem zu tun, dass praktisch die Domain localhost nicht erreichbar ist, während 127.0.0.1 funktioniert (siehe bearbeiteter vorheriger Beitrag).
 
Ich habe gerade festgestellt, dass ich in meinem DocumentRoot der PHP-Anwendung ja noch eine .htaccess-Datei liegen habe, die HSTS durchsetzt. Dementsprechend kommt der SSL-Fehler daher, dass ich die ganze Zeit auf https umgeleitet werde und Chrome clientseitig dies dann natürlich auch beibehalten hat, sodass später auch die Node-Anwendung nicht mehr funktionierte.

Der Klassiker. :)

Wir müssen rausfinden, ob das Problem an deinem Host, an Docker oder an deinem Projekt-Setup liegt. Dazu würde ich vorschlagen, dass wir ein Minimal Working Example erstellen, und zwar unter gleichen Voraussetzungen und mit identischem Aufbau bei dir und mir:

I. Docker Desktop einrichten

1. Versionen überprüfen: Docker Desktop 2.2.04, Engine 19.03.8
2. Experimentelle Features aktivieren:

1584879441593.png


3. Bei Bedarf Docker Desktop neustarten
4. Zu Linux-Container switchen

II. Projekt einrichten

1. Eigenes Projektverzeichnis erstellen, z. B. myapp
2. .docker-Unterverzeichnis anlegen
3. Dockerfile im Projektverzeichnis erstellen:

Code:
FROM php:7.4-apache

COPY . /srv/app
COPY .docker/vhost.conf /etc/apache2/sites-available/000-default.conf

RUN chown -R www-data:www-data /srv/app \
    && a2enmod rewrite

4. Apache-Konfiguration im Unterverzeichnis erstellen (.docker/vhost.conf:

Apache-Konfiguration:
<VirtualHost *:80>
    DocumentRoot /srv/app/public

    <Directory "/srv/app/public">
        AllowOverride all
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

III. Image erstellen

1. Alle Container stoppen:
  • Git Bash: docker container stop $(docker container ps -q)
  • PowerShell: docker container ps -q | % { docker container stop $_ }
2. Nicht benötigte und Dangling Images löschen: docker image prune -af
3. Image erstellen (im Projektverzeichnis ausführen): docker image build -t myapp .

IV. Container starten und Verbindung testen

1. Neuen Container starten: docker container run -d -p 80:80 myapp
2. Erreichbarkeit von Apache im Browser unter http://localhost testen

Bei mir sieht es wie in Beitrag #2 aus. Jetzt bin ich gespannt, wie es bei dir aussieht. :D
  • Wenn es funktioniert, muss bei deinem anderen Projekt eine Konfiguration Probleme bereiten.
  • Wenn es nicht funktioniert, ist eine konkurrierende Konfiguration bei deinem Host Schuld.
 
Die Versionen und Einstellungen stimmen mit deinen überein.
Habe alles exakt so gemacht, wie du es so ausführlich beschrieben hast.
Das Ergebnis: Wie gehabt bekomme ich unter localhost einen Fehler ERR_CONNECTION_REFUSED angezeigt.
127.0.0.1 geht hingegen. Da habe ich dann den gleichen Output wie bei dir.

Es wird also an einer konkurrierenden Konfiguration des Hosts liegen. Ich habe nur keine Ahnung, wo die liegen könnte. :D

Schon mal vielen Dank für deine Mühen bis jetzt! :)
 
Es wird also an einer konkurrierenden Konfiguration des Hosts liegen. Ich habe nur keine Ahnung, wo die liegen könnte. :D

Tja, damit haben wir natürlich die Büchse der Pandora aufgemacht. Läuft eventuell noch ein Apache oder eine Node-App auf dem PC? Gibt es Netzwerkinterfaces von irgendwelchen Programmen, die dazwischenfunken? Ich habe leider keine Ahnung, welche Stolpersteine es da unter Windows gibt (habe 'ne frische Installation hier). @alinnert: Weißt du da evtl. was?

Und dennoch, da die Sache ja im Grunde läuft - Glückwunsch zur ersten containerisierten Anwendung! :coffee:
 
Zuletzt bearbeitet:
Danke, ich werde wohl mal auf die Suche gehen müssen. Bisher habe ich noch keine Idee, welches ominöse Programm dahinterstecken könnte. :D
 
Das ist ja echt verrückt: Ich habe jetzt festgestellt, dass nur Chrome die Probleme macht.
Bei allen anderen Browsern kann ich localhost ohne Probleme aufrufen. :LOL:
 
Zurück
Oben Unten