wake-up-neo.com

Bereitstellen einer Minimalflaschen-App bei Problemen mit Docker-Server-Verbindungen

Ich habe eine App, deren einzige Abhängigkeit die Flasche ist, die außerhalb des Dockers ausgeführt wird und an den Standardport 5000 gebunden ist. Hier ist die vollständige Quelle:

from flask import Flask

app = Flask(__name__)
app.debug = True

@app.route('/')
def main():
    return 'hi'

if __== '__main__':
    app.run()

Das Problem ist, dass der Server bei der Bereitstellung im Andockfenster ausgeführt wird, jedoch außerhalb des Containers nicht erreichbar ist.

Unten ist meine Dockerfile. Das Image ist Ubuntu mit installiertem Kolben. Der Tar enthält nur den oben aufgeführten index.py;

# Dockerfile
FROM dreen/flask
MAINTAINER dreen
WORKDIR /srv

# Get source
RUN mkdir -p /srv
COPY perfektimprezy.tar.gz /srv/perfektimprezy.tar.gz
RUN tar x -f perfektimprezy.tar.gz
RUN rm perfektimprezy.tar.gz

# Run server
EXPOSE 5000
CMD ["python", "index.py"]

Hier sind die Schritte, die ich implementiere

$> Sudo docker build -t perfektimprezy .

Soweit ich weiß, dass das oben Genannte läuft, hat das Bild den Inhalt des Tar in /srv. Starten wir nun den Server in einem Container:

$> Sudo docker run -i -p 5000:5000 -d perfektimprezy
1c50b67d45b1a4feade72276394811c8399b1b95692e0914ee72b103ff54c769

Läuft es tatsächlich?

$> Sudo docker ps
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS                    NAMES
1c50b67d45b1        perfektimprezy:latest   "python index.py"   5 seconds ago       Up 5 seconds        0.0.0.0:5000->5000/tcp   loving_wozniak

$> Sudo docker logs 1c50b67d45b1
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat

Ja, scheint der Flask-Server zu laufen. Hier wird es komisch. Lass uns eine Anfrage an den Server stellen:

 $> curl 127.0.0.1:5000 -v
 * Rebuilt URL to: 127.0.0.1:5000/
 * Hostname was NOT found in DNS cache
 *   Trying 127.0.0.1...
 * Connected to 127.0.0.1 (127.0.0.1) port 5000 (#0)
 > GET / HTTP/1.1
 > User-Agent: curl/7.35.0
 > Host: 127.0.0.1:5000
 > Accept: */*
 >
 * Empty reply from server
 * Connection #0 to Host 127.0.0.1 left intact
 curl: (52) Empty reply from server

Leere Antwort ... Aber läuft der Prozess?

$> Sudo docker top 1c50b67d45b1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                2084                812                 0                   10:26               ?                   00:00:00            python index.py
root                2117                2084                0                   10:26               ?                   00:00:00            /usr/bin/python index.py

Nun lass uns ssh in den Server und überprüfen ...

$> Sudo docker exec -it 1c50b67d45b1 bash
[email protected]:/srv# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:47677         127.0.0.1:5000          TIME_WAIT
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
[email protected]:/srv# curl -I 127.0.0.1:5000
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 5447
Server: Werkzeug/0.10.4 Python/2.7.6
Date: Tue, 19 May 2015 12:18:14 GMT

Es ist in Ordnung ... aber nicht von außen :( Was mache ich falsch?

57
Dreen

Das Problem ist, dass Sie nur an die Schnittstelle localhost gebunden sind. Sie sollten an 0.0.0.0 gebunden sein, wenn der Container von außen zugänglich sein soll. Wenn Sie sich ändern:

if __== '__main__':
    app.run()

zu

if __== '__main__':
    app.run(Host='0.0.0.0')

Es sollte funktionieren.

94
Adrian Mouat

Wenn Sie den Befehl flask anstelle von app.run verwenden, können Sie die Option --Host übergeben, um den Host zu ändern. Die Linie in Docker wäre:

CMD ["flask", "run", "--Host", "0.0.0.0"]

oder

CMD flask run --Host 0.0.0.0
13
Marku