首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法从外部机器访问公开的Docker容器端口,只能从localhost访问?

无法从外部机器访问公开的Docker容器端口,只能从localhost访问?
EN

Stack Overflow用户
提问于 2017-04-06 09:13:40
回答 2查看 24.2K关注 0票数 17

我在我的Ubuntu Linux 14.04机器上运行了一个Docker容器,它公开了一个端口:

代码语言:javascript
运行
复制
docker run --name spacyapi -d -p 127.0.0.1:7091:7091 jgontrum/spacyapi:en

我可以在容器中的服务器上连接并执行命令,而不会在本地机器上出现问题。例如:

代码语言:javascript
运行
复制
curl http://localhost:7091/api --header 'content-type: application/json' --data '{"text": "This is a test."}' -X POST

该命令将忠实地执行。但是,如果我从外部机器尝试相同的CURL命令,我会得到一个“连接被拒绝”的错误:

代码语言:javascript
运行
复制
curl http://192.5.169.50:5000/api --header 'content-type: application/json' --data '{"text": "This is a test."}' -X POST
curl: (7) Failed to connect to 192.5.169.50 port 7091: Connection refused

其中192.5.169.50是运行Docker容器的机器的IP地址。

我认为我不需要任何iptables规则,因为我不需要为在同一机器上运行的Node.JS服务器设置任何规则。我的本地网络上的所有其他计算机都可以很好地访问Node.JS服务器。而不是充当服务器的Docker容器。

我该如何解决这个问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-06 10:43:17

您没有使用此标志公开发布您的端口:

代码语言:javascript
运行
复制
-p 127.0.0.1:7091:7091

该标志表示在主机127.0.0.1接口(localhost)上将端口7091发布到容器端口7091。到达该端口的唯一方法是位于主机上并连接到环回接口。

要公开发布端口,请从该标记中删除IP:

代码语言:javascript
运行
复制
-p 7091:7091

或使用以下命令显式发布到所有接口:

代码语言:javascript
运行
复制
-p 0.0.0.0:7091:7091

只要您没有使用dockerd --ip x.x.x.x覆盖docker守护进程设置或在/etc/docker/daemon.json文件中设置ip值,则后一种格式与第一种格式相同。

票数 15
EN

Stack Overflow用户

发布于 2017-04-06 10:14:23

容器的IP不是192.5.169.50。尝试执行docker inspect <container-uid> | grep IPAddress来检查容器的IP是什么。我认为应该是172.17.0.X之类的。

您也可以只执行docker run -d --network=host <image>,它将容器堆叠在主机网络的顶部。

容器只是位于主机之上的东西,主机才是真正与外部通信的主机。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43244074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档