我遇到了问题,无法将网络请求发送到我创建的Docker容器。我已经公开了正确的端口,所以我不确定这里还有什么其他问题。
我有一个服务器在alice
的容器localhost:10009
中运行:
$ docker exec -it alice bash
bash-4.4# curl localhost:10009
curl: (52) Empty reply from server
端口10009从我的容器中暴露了:
$ docker port alice
10009/tcp -> 0.0.0.0:10009
从主机上执行相同的curl
时,会收到不同的消息:
$ curl localhost:10009
curl: (56) Recv failure: Connection reset by peer
答案 0 :(得分:3)
根据Docker official documentation,我认为@Bouzid Zitouni的答案存在一些问题:
这与nginx进程直接在Docker主机上而不是在容器中运行的隔离级别相同
但是,如果您使用--network host
,则容器中将没有隔离的网络,而host
网络驱动程序仅可在Linux主机上使用。
发生连接拒绝/重置的问题是因为您的服务器正在侦听容器内部的127.0.0.1,并且端口转发将转到容器的外部IP(例如172.17.0.2)。
解决方案
在这种情况下,您需要运行一个新的容器,使您的服务器在所有接口上进行侦听。使用python http.server
的示例:
docker run -p 8000:8000 -it python:3.7-slim python3 -m http.server --bind 0.0.0.0
注意
选项--bind 0.0.0.0
是http.server
的特定选项。可能您的服务器还有其他方式可以指定它。
参考:
答案 1 :(得分:2)
我将检查服务器应用程序是否配置为仅侦听来自其“本地主机”的请求,此检查取决于未使用的服务器类型。
一个简单的检查方法如下:
docker run --network host -d yourimagename
由于您使用的是host
网络,因此您无需担心端口映射
然后尝试卷曲,如果可行,那么您只需要查看服务器侦听IP设置即可。
curl localhost:10009
答案 2 :(得分:0)
我想详细介绍@Bouzid Zitouni的答案。服务器绑定到的地址似乎确实存在问题。
由对等方重置的连接通常表示已为未指向侦听服务器的容器定义了端口映射。这是一个说明这一点的示例:
docker run -p 10009:10009 -it ubuntu bash
在容器中安装nmap
:
apt-get update && apt install -y nmap
运行ncat
(仅适用于本地主机)
# ncat -v --listen localhost 10009
...
Ncat: Listening on 127.0.0.1:10009
在主机上运行curl
:
# curl localhost:10009
curl: (56) Recv failure: Connection reset by peer
即使根本没有任何服务器进程,您实际上也会得到相同的结果。
运行ncat
(所有IP)
# ncat -v --listen 10009
...
Ncat: Listening on :::10009
Ncat: Listening on 0.0.0.0:10009
主机上的 Curl
成功连接。希望有帮助。