Docker容器不与同一Docker网络(网桥)中的其他容器通信



我正在尝试在amazon web服务器上设置web服务器的环境。我想使用django、react、nginx,它们在每个docker容器上运行。

Belows是用于运行docker容器的命令。

sudo docker run --name django-server
-it -d -p "8000:8000"
--volume=$(pwd)/trello-copy-django-src:/backend/trello-copy
django-server
sudo docker run --name nginx-server
-d -p "80:80"
--volumes-from react-server
nginx-server

我并没有指定一个自定义的docker网桥,我通过键入$ docker inspect bridge来检查它们是否在同一个默认网桥上。

[{
"Name": "bridge",
...,
"Containers": {
"...": { "Name": "django-server", ... },
"...": { "Name": "react-server", ... },
"...": { "Name": "nginx-server", ... },
}
}]

所以,我希望下面的react代码能正常工作。但它只适用于我的笔记本电脑,它和aws的docker结构完全相同。

...
const res = await fetch('http://127.0.0.1:8000/api/');
...

Failed to load resource: net::ERR_CONNECTION_REFUSED127.0.0.1:8000/api/:1

我做错了什么?


这些是django的settings.py文件中的代码。

CORS_ORIGIN_ALLOW_ALL=True # only for dev
CORS_ALLOW_CREDENTIALS=True # only for dev
CORS_ORIGIN_WHITELIST = (
'http://localhost',
'http://localhost:3000',
)

CORS消息为App.js:10 Fetch API cannot load django-server:8000/api/. URL scheme must be "http" or "https" for CORS request.

我认为这是另一个问题,然后django和CORS并不是真正的问题。。。我说得对吗?


我发现ajaxawait fetch('http://127.0.0.1:8000/api/');的"localhost"实际上意味着客户端(浏览器(。

我必须在那里使用服务器的公共IP吗?

您不能通过127.0.0.1调用。相反,您需要使用正在运行的容器的名称。像这样:

const res = await fetch('django-server:8000/api/');