我有一个dockerized 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" ]
运行应用程序时,我将Docker容器的端口8080和8081映射到主机上的相同端口,如下所示...
$ 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
答案 0 :(得分:0)
解决方法如下
公开Dockerfile中的两个端口
$ grep EXPOSE Dockerfile
EXPOSE 8080
EXPOSE 8081
使用0.0.0.0而不是127.0.0.1
import http.server
from prometheus_client import start_http_server
from prometheus_client import Counter
HOST='0.0.0.0'
HELLO_WORLD_PORT=8080
HELLO_WORLD_METRICS_PORT=8081
REQUESTS = Counter('hello_world_total', 'Hello World Requested')
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")
if name == "main":
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
$
外部参照:-Docker Rails app fails to be served - curl: (56) Recv failure: Connection reset by peer 有关类似问题的详细信息