我在我的Ubuntu Linux 14.04机器上运行了一个Docker容器,它公开了一个端口:
docker run --name spacyapi -d -p 127.0.0.1:7091:7091 jgontrum/spacyapi:en
我可以在容器中的服务器上连接并执行命令,而不会在本地机器上出现问题。例如:
curl http://localhost:7091/api --header 'content-type: application/json' --data '{"text": "This is a test."}' -X POST
该命令将忠实地执行。但是,如果我从外部机器尝试相同的CURL命令,我会得到一个“连接被拒绝”的错误:
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容器。
我该如何解决这个问题呢?
发布于 2017-04-06 10:43:17
您没有使用此标志公开发布您的端口:
-p 127.0.0.1:7091:7091
该标志表示在主机127.0.0.1接口(localhost)上将端口7091发布到容器端口7091。到达该端口的唯一方法是位于主机上并连接到环回接口。
要公开发布端口,请从该标记中删除IP:
-p 7091:7091
或使用以下命令显式发布到所有接口:
-p 0.0.0.0:7091:7091
只要您没有使用dockerd --ip x.x.x.x
覆盖docker守护进程设置或在/etc/docker/daemon.json文件中设置ip
值,则后一种格式与第一种格式相同。
发布于 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>
,它将容器堆叠在主机网络的顶部。
容器只是位于主机之上的东西,主机才是真正与外部通信的主机。
https://stackoverflow.com/questions/43244074
复制相似问题