Нет доступа к внешней сети для контейнера Jupyter Notebook, порожденного JupyterHub - PullRequest
1 голос
/ 23 января 2020

Итак, вот что я пытаюсь достичь:

  • Сервер Jupyterhub
  • , который при доступе и отсутствии входа в систему переносит вас на другой веб-сервер (пользовательский закодировано в Django)
  • Этот веб-сервер использует OAuth для аутентификации пользователя
  • И контейнер ноутбука создается.
  • Этот контейнер ноутбука должен быть предварительно заполнен токен, который используется пользовательской библиотекой, вставленной в изображение ноутбука Docker для аутентификации в службе.
  • Контейнер ноутбука должен иметь возможность взаимодействовать с веб-сервером для дальнейшего взаимодействия, такого как получение результатов и т.д. c.

Я более или менее достиг этого, за исключением последней части. Я запускаю сервер ноутбуков, но у него нет доступа к внешнему миру. Он может получить доступ только к Jupyter Hub (именно поэтому он работает!) И ничего больше.

Вот моя конфигурация Jupyter Hub, относящаяся к DockerSpawner (я опускаю настройки OAuth, поскольку они работают как положено.

# Tell JupyterHub that we want Docker Spawner to be used.
c.JupyterHub.spawner_class = 'dockerspawner.DockerSpawner'

# And what image should be used by the Docker Spawner
c.DockerSpawner.image = 'jupyter/scipy-notebook:7a0c7325e470'

# The Hub must listen on all interfaces.
c.JupyterHub.hub_ip = '0.0.0.0'

# And this should be the address of the Hub API
c.JupyterHub.hub_connect_ip = 'jupyterhub'

# Ask containers to connect to this network so that they can
# communicate with the Hub.
c.DockerSpawner.network_name = 'djangodockerjupyterdemo_default'

# And let's not make a mess, remove user containers when done.
c.DockerSpawner.remove = True

# We need to set the Notebook Directory
notebook_dir = '/home/jovyan/work'
c.DockerSpawner.notebook_dir = notebook_dir

# Need to tell where to mount the volumes.
c.DockerSpawner.volumes = { 'jupyterhub-user-{username}': notebook_dir }

Обратите внимание, что djangodockerjupyterdemo_default создается с помощью docker -compose благодаря названию каталога проекта (я знаю, что это не лучшая вещь, но сейчас я Я просто надеюсь, что будет работать минимальный пример.)

Вот мой docker -компонент:

version: "2"

services:
  database:
      image: "mysql:5.6"
      volumes:
      - ./data:/var/lib/mysql
      environment:
      - MYSQL_ROOT_PASSWORD=test123
      - MYSQL_DATABASE=oauthserver
      - MYSQL_USER=oauthadmin
      - MYSQL_PASSWORD=test123
  webapp:
    image: auth_server:latest
    volumes:
      - ./:/app
    links:
      - database:database
    environment:
      - PYTHONUNBUFFERED=1
      - ENV=DEV
      - DATABASE_HOST=database
      - DATABASE_USER=oauthadmin
      - DATABASE_DBNAME=oauthserver
      - DATABASE_PASSWORD=test123
    hostname: oauthserver.ddi.in
  jupyterhub:
    image: "jupyterhub:test"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:rw"
      - "./jupyterhub:/srv/jupyterhub"
    environment:
      - OAUTH2_AUTHORIZE_URL=http://oauthserver.ddi.in:8000/o/authorize
      - OAUTH2_TOKEN_URL=http://oauthserver.ddi.in:8000/o/token/
    hostname: jhtest.ddi.in
    links:
      - webapp:oauthserver.ddi.in

Я использую https://hub.docker.com/r/defreitas/dns-proxy-server для доступа к Сервер JupyterHub, сказав «http://jhtest.ddi.in: 8000 ».

Теперь, когда контейнеры работают, вот что я могу подтвердить:

  • docker exec вставка в webapp или jupyterhub контейнеров, а затем wget загрузка файла из некоторого места в Inte rnet работает.
  • docker exec вставка в порожденный контейнер для ноутбуков Jupyter и выполнение тех же действий нет. То же самое касается попытки использовать requests.get() внутри ноутбука.

Как я могу сделать порожденный ноутбук доступ к внешнему миру? Это важно для моего варианта использования (и я уверен, что разумное ожидание).

PS: я заметил, что нет никаких примеров, охватывающих установку OAuth JupyterHub с пользовательским приложением Django. Я надеюсь опубликовать sh мой пример публично и, надеюсь, он может послужить источником для документации по Jupyter Hub.

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Так что я смог найти решение. Я суммирую это ниже.

Корректировки на docker-compose.yml включают добавление network_mode: bridge ко всем услугам. Это позволяет контейнерам по существу получить доступ к внешнему миру. Однако стоимость этого заключается в том, что контейнеры не могут автоматически взаимодействовать друг с другом посредством простой ссылки на имя службы. Но это легко можно решить с помощью ссылок.

Следующей настройкой было настроить DockerSpawner для создания контейнеров, которые используют мостовую сеть по умолчанию вместо какой-либо другой сети. Настройки, которые помогают в этом:

c.DockerSpawner.network_name = 'bridge'
c.DockerSpawner.use_internal_ip = True
c.DockerSpawner.extra_host_config = {'network_mode': 'bridge'}

Кроме того, поскольку ноутбук не может обнаружить основной JupyterHub, используя имя службы, я настраиваю c.JupyterHub.hub_connect_ip на имя хоста службы JupyterHub. Обратите внимание, что использование прокси-сервера dns, упомянутого в моем вопросе, помогает преобразовать имя хоста в IP-адрес контейнера.

Надеюсь, это кому-то поможет. Я скоро опубликую весь пример Django -OAuth-JupyterHub в моем блоге.

РЕДАКТИРОВАТЬ: Как уже упоминалось выше, я написал сообщение в блоге, описывающее, как заставить JupyterHub аутентифицировать пользователей с помощью OAuth с Django , Вот ссылка: https://vkaustubh.github.io/blog/geek/2020-02-08-integrating-jupytethub-with-django.html

0 голосов
/ 23 января 2020

Возможно, вы захотите сделать очень короткое сообщение на форуме Jupyter Discourse Forum в категории «JupyterHub», выделив этот пост, чтобы привлечь к нему больше внимания экспертов.

...