Tôi có một ứng dụng phụ thuộc duy nhất là flask, chạy tốt bên ngoài docker và liên kết với cổng mặc định 5000
. Đây là nguồn đầy đủ:
from flask import Flask
app = Flask(__name__)
app.debug = True
@app.route('/')
def main():
return 'hi'
if __name__ == '__main__':
app.run()
Vấn đề là khi tôi triển khai điều này trong docker, máy chủ đang chạy nhưng không thể truy cập được từ bên ngoài vùng chứa.
Dưới đây là Dockerfile của tôi. Hình ảnh là ubuntu có cài đặt flask. Tar chỉ chứa index.py
danh sách ở trên;
# 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"]
Đây là các bước tôi đang làm để triển khai
$> sudo docker build -t perfektimprezy .
Theo như tôi biết ở trên chạy tốt, hình ảnh có nội dung của tar trong /srv
. Bây giờ, hãy khởi động máy chủ trong một vùng chứa:
$> sudo docker run -i -p 5000:5000 -d perfektimprezy
1c50b67d45b1a4feade72276394811c8399b1b95692e0914ee72b103ff54c769
Nó có thực sự đang chạy không?
$> 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
Đúng, có vẻ như máy chủ bình đang chạy. Đây là nơi nó trở nên kỳ lạ. Hãy đưa ra yêu cầu tới máy chủ:
$> 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
Trả lời trống ... Nhưng quá trình này có đang chạy không?
$> 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
Bây giờ chúng ta hãy ssh vào máy chủ và kiểm tra ...
$> 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
Nó ổn ... nhưng không phải từ bên ngoài :( Tôi đang làm gì sai?
docker exec -it 1c50b67d45b1 bash
và sau đó chọn lệnh thông thường netstat -an
hoặc bất kỳ lệnh nào bạn sẽ làm khi gỡ lỗi Bình (đuôi, mèo ...)
Connected to 127.0.0.1
)