Django в Docker без подключения к локальной сети - PullRequest
0 голосов
/ 28 марта 2019

Когда я запускаю Django в контейнере, я не могу получить к нему доступ, если не запущен с python manage.py runserver 0.0.0.0:8000.Тем не менее, это позволяет любому в моей сети подключаться, что мне не нужно.

В моем файле создания докера у меня есть:

ports:
      - "8000:8000"

При доступе к 127.0.0.1:8000, просто запустивpython manage.py runserver, я получаю ошибку ERR_EMPTY_RESPONSE.

Можно ли получить доступ к моему серверу, не открывая его для всей сети?

Ответы [ 3 ]

1 голос
/ 29 марта 2019

Короче говоря: процесс внутри контейнера должен быть привязан к 0.0.0.0, чтобы вообще быть доступным снаружи контейнера;но затем вы можете использовать опцию Docker Compose ports:, чтобы контролировать, откуда он действительно доступен.Если вы измените его на "127.0.0.1:8000:8000", он будет недоступен вне хоста.

Контейнеры Docker работают в изолированной сети .Типичная настройка может выглядеть следующим образом:

 ^^^
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, и снова сервер недоступен из общедоступного Интернета, даже если он связан со «всеми интерфейсами».)

Если вы зададите для процесса контейнера привязку только к 127.0.0.1, его собственному интерфейсу lo0, он не будет принимать входящий трафик от интерфейса eth0 172.17.0.2, что означает, что ничто извне не сможет достичь его..

Если вы зададите для процесса контейнера привязку 0.0.0.0 («все интерфейсы»), то он будет принимать трафик с хоста, отправленный с 172.17.0.1 (возможно, интерфейс docker0).Однако это не то же самое, что принимать трафик из «всей сети»: как уже говорилось, хост 2 по-прежнему не знает, как маршрутизировать трафик туда.

Вы можете использовать docker run -p или Docker Compose.ports: опция для ограничения того, на какие интерфейсы Docker будет публиковать порты.Если вы измените ports: на "127.0.0.1:8000:8000", то контейнер будет доступен с порта 8000 на хосте, но только через интерфейс обратной связи хоста;опять же, для хоста 2 нет маршрута для отправки пакетов процессу.

0 голосов
/ 28 марта 2019

Вы можете создать собственную сеть в docker-compose, см. Документ здесь . Все, что вам нужно, это выяснить или назначить IP-адрес этой сети и получить доступ к контейнеру, набрав в своем браузере IP: порт .

0 голосов
/ 28 марта 2019

вы запускаете 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

где app - название вашего проекта

Я получил это из этого урока: https://www.udemy.com/django-python-advanced/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...