Docker:从容器内部到localhost:端口的连接被拒绝

时间:2018-05-15 09:51:10

标签: docker connection containers

我试图确保不同容器和端口 8040 使用的本地主机地址( 127.0.0.1 )之间的连接。(我的Web应用程序容器使用此端口运行。)

 root@a70b20fbda00:~# curl -v http://127.0.0.1
 * Rebuilt URL to: http://127.0.0.1/
 * Hostname was NOT found in DNS cache
 *   Trying 127.0.0.1...
 * connect to 127.0.0.1 port 80 failed: Connection refused
 * Failed to connect to 127.0.0.1 port 80: Connection refused
 * Closing connection 0
 curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused

当我想从容器内部连接到localhost时,这就是我所获得的

root@a70b20fbda00:~# curl -v http://127.0.0.1:8040
* Rebuilt URL to: http://127.0.0.1:8040/
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* connect to 127.0.0.1 port 8040 failed: Connection refused
* Failed to connect to 127.0.0.1 port 8040: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 127.0.0.1 port 8040: Connection refused

关于每个容器中的 iptables

 root@a70b20fbda00:~# iptables
 bash: iptables: command not found

容器之间的连接很好

root@635114ca18b7:~# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.253 ms
--- 172.17.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
root@635114ca18b7:~# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.080 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.100 ms
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
root@635114ca18b7:~# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.149 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.180 ms
--- 172.17.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.149/0.164/0.180/0.020 ms

Ping 127.0.0.1:8040

root@635114ca18b7:~# ping 127.0.01:8040
ping: unknown host 127.0.0.1:8040

在这种情况下我需要做什么?

所以全球形象有两个容器,

  • 第一个容器包含一个 tomcat服务器,用于部署我的 Web应用程序,它可以完美地转动。
  • 第二个是需要连接到Web应用程序的容器 URL。的 http://127.0.0.1:8040/my_app

2 个答案:

答案 0 :(得分:2)

您必须使用docker run --network host IMAGE:TAG来实现所需的连接

进一步阅读here

例如: -

docker run --network host --name CONTAINER1 IMAGE:tag

docker run --network host --name CONTAINER2 IMAGE:tag

在容器内 - CONTAINER2,您将能够访问其他容器作为主机CONTAINER1

要访问该服务,您必须执行CONTAINER:

答案 1 :(得分:0)

根据提供的信息,看起来有两个容器。如果这两个容器是由没有--net=host的docker启动的,那么每个容器都会获得两个不同的IP地址。假设您的第一个容器为172.17.0.2,第二个容器为172.17.0.3

在这种情况下,每个容器都会获得自己的网络堆栈。所以127.0.0.1指的是它自己的网络堆栈不一样。

正如@kakabali指出的那样,可以使用主机网络运行容器,共享主机的网络堆栈。

其他选项之一是使用第二个容器中第一个容器的实际IP地址。

second-container# curl http://172.17.0.2

或者另一个选择是运行第二个容器作为sidekick / sidecar容器共享第一个容器的网络堆栈。

docker run --net=container:${ID_OF_FIRST_CONTAINER} ${IMAGE_SECOND}:${IMAGE_TAG_SECOND}

或者如果您正确使用links docker run --name web -itd ${IMAGE_FIRST}:${TAG_FIRST} docker run --link web -itd ${IMAGE_SECOND}:${TAG_SECOND}

注意:不推荐使用docker --link功能。

另一个选择是使用容器管理平台,自动为您处理服务发现。

PS:您无法ping其他端口上的IP地址。有关详细信息,请单击here