Как я могу получить свое докеризованное приложение Python для вывода на 2 отдельных порта? - PullRequest
2 голосов
/ 28 июня 2019

У меня есть докернизированное приложение Python, которое выводит данные на порт 8080 и порт 8081. Я выполняю код в системе Ubuntu.

$ docker version | grep Version
 Version:      18.03.1-ce

Приложение отвечает на порт 8080

$ curl -k localhost:8080 | tail -4
-->
TYPE hello_world_total counter
hello_world_total 3.0
TYPE hello_world_created gauge
hello_world_created 1.5617357381235116e+09

Приложение возвращает ОШИБКУ на порт 8081

$ curl -k localhost:8081
curl: (56) Recv failure: Connection reset by peer

Хотя я не знаком с netstat, я использовал его, чтобы проверить, что оба порта 8080 и 8081 находились в состоянии LISTEN ...

root@1d1ac2974893:/# netstat -apn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      1/python3
tcp        0      0 127.0.0.1:8081          0.0.0.0:*               LISTEN      1/python3
tcp        0      0 172.17.0.2:58220        16.46.41.11:8080        TIME_WAIT   -
tcp        0      0 172.17.0.2:58218        16.46.41.11:8080        TIME_WAIT   -
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path
root@1d1ac2974893:/#

Мой Dockerfile выглядит следующим образом ...

$ cat Dockerfile
FROM python:3
RUN pip3 install prometheus_client
COPY sampleapp.py /src/sampleapp.py
EXPOSE 8081
CMD [ "python3", "/src/sampleapp.py" ]

Когда я запускаю приложение, я сопоставляю оба порта 8080 и 8081 из контейнера Docker с теми же портами на хосте следующим образом...

$ docker run -p 8081:8081 -p 8080:8080 sampleapp 

Если я зайду в Контейнер и повторю приведенные выше команды curl, они будут работать так, как я ожидаю.

root@1d1ac2974893:/# curl -k localhost:8081 | tail -4
TYPE hello_world_total counter
hello_world_total 3.0
TYPE hello_world_created gauge
hello_world_created 1.5617357381235116e+09
root@1d1ac2974893:/#

AND

$ docker exec -it 1d1ac2974893 /bin/bash
root@1d1ac2974893:/# curl -k localhost:8081
Hello World

SOвопрос в том, почему последняя команда curl НЕ работает с хост-системы.

$ curl -k localhost:8081
curl: (56) Recv failure: Connection reset by peer

1 Ответ

0 голосов
/ 01 июля 2019

Решение было следующим:

  1. Предоставить оба порта в Dockerfile $ grep EXPOSE Dockerfile EXPOSE 8080 EXPOSE 8081

  2. Использовать 0.0.0.0 вместо 127.0.0.1 import http.server from prometheus_client import start_http_server from prometheus_client import Counter</p> <p>HOST='0.0.0.0' HELLO_WORLD_PORT=8080 HELLO_WORLD_METRICS_PORT=8081 REQUESTS = Counter('hello_world_total', 'Hello World Requested')</p> <p>class MyHandler(http.server.BaseHTTPRequestHandler): def do_GET(self): REQUESTS.inc() self.send_response(200) self.end_headers() self.wfile.write(b"Hello World\n")</p> <p>if <strong>name</strong> == "<strong>main</strong>": start_http_server(HELLO_WORLD_METRICS_PORT) server = http.server.HTTPServer((HOST, HELLO_WORLD_PORT), MyHandler) server.serve_forever()

Теперь Contaainer выдает ожидаемые результаты при запуске с хоста $ curl -k localhost:8080 Hello World $ $ curl -k localhost:8081 | tail -4 ... # TYPE hello_world_total counter hello_world_total 1.0 # TYPE hello_world_created gauge hello_world_created 1.5619773258069074e+09 $

Xref: - Приложение Docker Rails не обслуживается - curl:(56) Ошибка записи: сброс соединения с помощью узла для получения сведений о подобной проблеме

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...