他每个人。我正在与docker一起工作,并试图将一个简单的django应用程序对接到一个外部http连接到一个网页(真正的网站),所以当我在Docker文件中设置我的django服务器的地址时,它应该在容器- 127.0.0.1:8000.中工作。我的应用程序没有工作,因为无法与网站进行外部连接。
但是,当我为服务器设置端口:0.0.0.0:8000时,它就开始工作了。
,所以我的问题是:,为什么它会这样?在这个特殊情况下,有什么不同?我只想了解它。
我读了一些关于0.0.0.0的文章,它就像一个“泛型”或“占位符”端口,允许使用OC默认端口。
127.0.0.1类似于将请求重定向到当前计算机的主机。我就知道。但是当我在本地机器上运行这个应用程序(主机: 127.0.0.0:8000)时,一切都正常,应用程序可以连接到真正的网站,但如果是码头,它就停止工作了。
谢谢你的帮助!
这是我的资料来源: Docker文件
FROM python:3.6
RUN mkdir /code
WORKDIR /code
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . ./
EXPOSE 8000
ENTRYPOINT [ "python", "manage.py" ]
CMD [ "runserver", "127.0.0.1:8000" ] # doesn't work
# CMD [ "runserver", "0.0.0.0:8000" ] - works
docker-compose.yml
version: "3"
services:
url_rest:
container_name: url_keys_rest
build:
context: .
dockerfile: Dockerfile
image: url_keys_rest_image
stdin_open: true
tty: true
volumes:
- .:/var/www/url_keys
ports:
- "8000:8000"
这里是我在127.0.0.1的情况下收到的http错误。也许它会有用。
http: error: ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=8000): Max retries exceeded with url: /api/urls (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x10cd51e80>: Failed to establish a new connection: [Errno 61] Connection refused')) while doing GET request to URL: http://127.0.0.1:8000/api/urls
发布于 2019-12-04 18:07:07
必须设置容器的主进程以绑定到特殊的0.0.0.0“所有接口”地址,否则将无法从容器外部到达。
在Docker 127.0.0.1中,几乎所有的意思都是“这个容器”,而不是“这个机器”。如果从容器将出站连接到127.0.0.1,它将返回到同一个容器;如果将服务器绑定到127.0.0.1,则不会接受来自外部的连接。
Docker所做的核心工作之一就是给每个容器单独的网络空间。特别是,每个容器都有自己的lo
接口和自己的localhost
概念。
在非常低的级别上,网络服务调用bind(2)系统调用开始接受连接。它接受一个地址参数。它可以是两种情况之一:它可以是某个系统接口的IP地址,也可以是特殊的0.0.0.0“所有接口”地址。如果选择一个接口,它将只接受来自该接口的连接;例如,如果一个物理系统上有两个网卡,则可以使用该接口只接受来自一个网络的连接,而不能接受另一个网络的连接。
因此,如果将服务设置为绑定到127.0.0.1,则这是lo
接口的地址,服务将只接受来自该接口的连接。但是每个容器都有自己的lo
接口和自己的localhost
,因此这个设置会导致服务拒绝连接,除非它们是从容器本身内部启动的。它将其设置为绑定到0.0.0.0,它还将接受来自每个容器eth0
接口的连接,其中来自容器外部的所有连接都到达。
https://stackoverflow.com/questions/59179831
复制相似问题