我试图在Docker中运行我的hello-world应用程序:前端需要从后端使用REST。
我跑
docker run -p 1337:1337 --net=bridge me/p-dockerfile-advanced-backend:latest
docker run -p 1338:1338 --net=bridge me/p-dockerfile-advanced-frontend:latest http://127.0.0.1:1337
我可以使用主机操作系统中的浏览器(我的桌面Windows 10 x64)连接到它们两个:
前端应用程序需要http://127.0.0.1:1337
参数来了解restful服务所在的位置。但该应用程序无法连接到他们。我也无法联系。
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.
PS C:\Users\user1> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b0852253b8a me/p-dockerfile-advanced-frontend:latest "/usr/bin/java -ja..." 24 minutes ago Up 24 minutes 0.0.0.0:1338->1338/tcp laughing_noyce
e73f8a6efa24 me/p-dockerfile-advanced-backend:latest "/usr/bin/java -ja..." 26 minutes ago Up 26 minutes youthful_chandrasekhar
PS C:\Users\user1> docker exec -it 4b0852253b8a bash
root@4b0852253b8a:/# apt-get install telnet
<...>
root@4b0852253b8a:/# telnet localhost 1337
Trying 127.0.0.1...
Trying ::1...
telnet: Unable to connect to remote host: Cannot assign requested address
root@4b0852253b8a:/#
无法连接,但应该是因为我在两个容器上指定了--net=bridge
并且后端监听端口1337:
root@e73f8a6efa24:/# netstat -lntu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:1337 0.0.0.0:* LISTEN
root@e73f8a6efa24:/#
PS:在问这里之前,我花了差不多整天努力让它发挥作用。
答案 0 :(得分:1)
问题是127.0.0.1地址。
默认情况下,每个容器都分配了2个接口: eth0 和 lo (具有127.0.0.1地址的环回接口)。
您需要指定上一个容器的名称或地址。对于这个简单的应用程序,您可以使用 - link 选项。
docker run -p 1337:1337 --name backend me/p-dockerfile-advanced-backend:latest
docker run -p 1338:1338 --link backend:backend me/p-dockerfile-advanced-frontend:latest http://backend:1337
请注意, - link 选项已弃用,如下所述: https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/
答案 1 :(得分:0)
由于这些是不同的容器,因此您必须在两个容器上公开端口。运行第一个:
docker run -p 1337:1337 --net=bridge me/p-dockerfile-advanced-backend:latest
请注意,bridge
是默认网络,因此您需要额外付费。无论如何,默认情况下,两个容器都将位于同一个bridge
网络上。