代码之家  ›  专栏  ›  技术社区  ›  kayoz

在Docker的Django没有暴露在局域网中

  •  0
  • kayoz  · 技术社区  · 5 年前

    在容器中运行django时,除非使用 python manage.py runserver 0.0.0.0:8000 . 但是,这样做允许我网络上的任何人连接,而这是我不想要的。

    在我的Docker撰写文件中,我有:

    ports:
          - "8000:8000"
    

    当访问时 127.0.0.1:8000 通过跑步 python manage.py runserver 我得到了一个 ERR_EMPTY_RESPONSE 错误。

    有没有什么方法可以在不打开整个网络的情况下访问我的服务器?

    1 回复  |  直到 5 年前
        1
  •  1
  •   David Maze    5 年前

    简而言之:容器内的进程必须绑定到0.0.0.0,才能从容器外访问;但是您可以使用Docker Compose的 ports: 控制它实际可从何处访问的选项。如果你把它改成 "127.0.0.1:8000:8000" 它将无法从非主机访问。

    docker容器运行 an isolated network . 典型的设置可能如下所示:

     ^^^
    Router
      | 192.168.1.1
      +--------------------+-- ...
      | 192.168.1.2        | 192.168.1.3
    /- Host -----------\   Host 2
    |    172.17.0.1    |
    |     |            |
    |     | 172.17.0.2 |
    |  Container       |
    \------------------/
    

    作为实施细节 每个容器都有自己的专用IP地址。这是在一个隔离的网络上:192.168.1.3/24上的第二个主机不知道172.17.0.0/16上的容器专用网络甚至不知道如何在那里路由流量。由于每个容器都有自己的专用网络堆栈,因此每个容器也有自己的概念,即 localhost 手段。

    (将此关系图与直接在主机上运行的服务器进行比较。它可以在192.168.1.2上访问,但只能从同一个网络访问;路由器远端的客户机无法访问192.168.1.0/24专用网络,而且即使绑定到“所有接口”,服务器也无法从公共互联网访问。)

    如果将容器进程设置为仅绑定到其自己的lo0接口127.0.0.1,则它将不接受来自172.17.0.2 eth0接口的入站流量,这意味着外部的任何东西都无法到达它。

    如果将容器进程设置为绑定到0.0.0.0(“所有接口”),那么它将接受来自主机的流量,从172.17.0.1发送(可能是Docker0接口)。这与接受来自“整个网络”的流量不同,不过:正如前面所讨论的,主机2仍然不知道如何将流量路由到那里。

    你可以使用 docker run -p 或者码头工人作曲 端口: 选项来限制Docker将向哪些接口发布端口。如果你改变 端口: “127.0.0.1:8000:8000” 然后,容器将可以从主机上的端口8000访问,但只能通过主机的环回接口访问;同样,主机2没有向进程发送数据包的路由。

        2
  •  0
  •   Paul Choppin    5 年前

    你跑步了吗? python manage.py runserver 直接还是通过docker compose命令? docker-compose run --rm [appname] sh -c 'python manage.py runserver' 如果正确配置了dockerfile和dockercompose.yml,那么应该这样做。

    docker-compose.yml Postgreqsl数据库示例:

    version: "3"
    
    services:
      app:
        build:
          context: .
        ports:
          - "8000:8000"
        volumes:
          - ./app:/app
        command: >
          sh -c "python manage.py wait_for_db &&
                 python manage.py migrate &&
                 python manage.py runserver 0.0.0.0:8000"
        environment:
          - DB_HOST=db
          - DB_NAME=app
          - DB_USER=postgres
          - DB_PASS=supersecretpassword
        depends_on:
          - db
    
      db:
        image: postgres:10-alpine
        environment:
          - POSTGRES_DB=app
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=supersecretpassword
    

    Dockerfile:

    FROM python:3.7-alpine
    MAINTAINER Pshop
    
    ENV PYTHONUNBUFFERED 1
    
    COPY ./requirements.txt /requirements.txt
    RUN apk add --update --no-cache postgresql-client
    RUN apk add --update --no-cache --virtual .tmp-build-deps \
        gcc libc-dev linux-headers postgresql-dev
    RUN pip install -r /requirements.txt
    RUN apk del .tmp-build-deps
    
    RUN mkdir /app
    WORKDIR /app
    COPY ./app /app
    
    RUN adduser -D user
    USER user
    

    应用程序是您的项目名称

    我从本教程中得到了: https://www.udemy.com/django-python-advanced/

        3
  •  0
  •   hurturk    5 年前

    您可以在Docker Compose中创建自定义网络,请参见文档 here . 您所需要的只是找到或分配该网络的IP,然后通过键入其 IP端口 在您的浏览器中。