在Docker容器中建立hello-world应用程序之间的对话

问题描述 投票:0回答:2

我正在尝试在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)中的浏览器连接到它们:

enter image description here

enter image description here

前端应用程序需要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:在问这里之前,我花了差不多整天努力让它发挥作用。

docker
2个回答
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/中所述


0
投票

由于这些是不同的容器,因此您必须在这两个容器上公开端口。运行第一个:

docker run -p 1337:1337 --net=bridge me/p-dockerfile-advanced-backend:latest

请注意,bridge是默认网络,所以你是额外的。无论如何,默认情况下,两个容器都将位于相同的bridge网络上。

© www.soinside.com 2019 - 2024. All rights reserved.