Saya memiliki aplikasi yang hanya ketergantungannya adalah flask, yang bekerja dengan baik di luar buruh pelabuhan dan mengikat ke port default 5000
. Berikut sumber lengkapnya:
from flask import Flask
app = Flask(__name__)
app.debug = True
@app.route('/')
def main():
return 'hi'
if __name__ == '__main__':
app.run()
Masalahnya adalah ketika saya menerapkan ini di buruh pelabuhan, server sedang berjalan tetapi tidak dapat dijangkau dari luar penampung.
Di bawah ini adalah Dockerfile saya. Gambar tersebut adalah ubuntu dengan flask terpasang. Tar hanya berisi yang index.py
tercantum di atas;
# 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"]
Berikut langkah-langkah yang saya lakukan untuk menerapkan
$> sudo docker build -t perfektimprezy .
Sejauh yang saya tahu di atas berjalan dengan baik, gambar memiliki isi tar /srv
. Sekarang, mari kita mulai server dalam sebuah wadah:
$> sudo docker run -i -p 5000:5000 -d perfektimprezy
1c50b67d45b1a4feade72276394811c8399b1b95692e0914ee72b103ff54c769
Apakah itu benar-benar berjalan?
$> 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
Ya, sepertinya server flask sedang berjalan. Di sinilah menjadi aneh. Mari kita membuat permintaan ke server:
$> 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
Balasan kosong ... Tetapi apakah prosesnya berjalan?
$> 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
Sekarang mari ssh ke server dan periksa ...
$> sudo docker exec -it 1c50b67d45b1 bash
root@1c50b67d45b1:/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
root@1c50b67d45b1:/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
Tidak apa-apa ... tapi tidak dari luar :( Apa salahku?
docker exec -it 1c50b67d45b1 bash
perintah biasa netstat -an
atau perintah apa pun yang akan Anda lakukan saat men-debug Flask (tail, cat ...)
Connected to 127.0.0.1
)