У меня есть докернизированное приложение 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