首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Docker app服务器ip地址127.0.0.1差异0.0.0.0 ip

Docker app服务器ip地址127.0.0.1差异0.0.0.0 ip
EN

Stack Overflow用户
提问于 2019-12-04 15:49:02
回答 2查看 20.5K关注 0票数 31

他每个人。我正在与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文件

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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错误。也许它会有用。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

回答已采纳

发布于 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接口的连接,其中来自容器外部的所有连接都到达。

票数 44
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59179831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档