GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

Docker –Nginxプロキシの背後にあるJupyterをセットアップする方法

この記事では、Nginxリバースプロキシの背後でJupyterを構成する方法について説明します。このような構成は、多くの人にとってあまり明白ではないためです。 GitHubには多くの問題と要点があり、この問題に対して適切なソリューションを選択することは困難です。また、その方法を説明するさまざまな記事が見つかる場合がありますが、それらのほとんどは古く、CORS構成を十分にカバーしていません。

トピックはまだ流行しているので、記事を更新して構成を簡素化することにしました。

以下のコメントに感謝します。AndrewBarker 。記事の更新されたバージョンをキャッチします。

Docker構成

記事のこのセクションでは、通常のDocker環境でJupyterまたはJupyterHubを起動する必要がある場合について説明します。

JupyterHub構成

まず、すべての構成ファイルを配置するフォルダーを作成しましょう。

最終的な構造は次のとおりです。

mkdir docker
tree docker

docker
├── docker-compose.yaml
├── jupyter_notebook_config.py
└── nginx.conf
ドッカー作成

すべてを単純化するために、docker-compose.yamlを作成しました 、当社のサービスについて説明しています:

version: "3.7"
services:
  nginx:
    image: nginx:alpine
    volumes:
      - "./nginx.conf:/etc/nginx/nginx.conf:ro"
    ports:
      - 8080:8080
    links:
      - "jupyterhub"
  jupyterhub:
    image: jupyterhub/jupyterhub
    container_name: jupyterhub
    volumes:
      - "./jupyter_notebook_config.py:/root/.jupyter/jupyter_notebook_config.py:ro"

構成は簡単です–Jupyterhubの前にあるシンプルな小さなNginxDockerコンテナー。

どちらも最新バージョンからリリースされました。

Nginx構成

Nginxはポート8080に座っています ポート8080でリッスンします 同様に。

非常に重要: nginx.conf リバースプロキシ構成が含まれています。

Nginxが80以外のポートにある場合 または443 、次の構成ディレクティブを使用する必要があります:

  • proxy_set_header Host $host:$server_port;

デフォルトのポートにあるNginxの場合は、defaultを使用します 構成:

  • proxy_set_header Host $host;

ここで間違えると、Blocking Cross Origin API request for /api/contentsの受信を開始します。 エラーメッセージ。

繰り返しますが、これらのメッセージの主な理由は、Nginxコンテナのサービスバインディングとエクスポートのポートが等しいことではありません。

これが私のnginx.confです ポート8080でリッスンする場合 :

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;

    upstream ml {
        server jupyterhub:8000;
    }

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        listen 8080;

        location / {
            proxy_pass http://ml;

            proxy_redirect   off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # websocket headers
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }

}

Jupyter構成

JupyterHub構成の場合、/root/.jupyter/jupyter_notebook_config.pyに配置された次の構成を使用します :

# get the config object
c = get_config()
# JupyterHub listen address
c.JupyterHub.hub_ip = '0.0.0.0'
# JupyterHub connect hostname.
# In our case it's 'jupyterhub' by the name of the service from docker-compose.yaml
c.JupyterHub.hub_connect_ip = 'jupyterhub'
# Location for users notebooks
c.Spawner.notebook_dir = '~/'

Nginxプロキシの背後でJupyrterを起動する

新しいコンテナを作成したり、ユーザー認証設定を試したりする時間があまりありませんでした。主な目的は、クロスオリジンAPIリクエストをブロックするためのソリューションを提供することです / api / contents 問題。

したがって、この構成を起動する方法は次のとおりです。

docker-compose up -d

起動したばかりのコンテナに接続してユーザーを作成し、ノートブックをインストールします パッケージ:

docker exec -it jupyterhub /bin/bash

adduser 

pip install notebook

これで、JupterHubに接続し、作成したユーザー名とパスワードをログイン資格情報として使用できます。

ドッカースウォーム構成

記事のこのセクションでは、DockerSwarmモードでJupyterまたはJupyterHubを起動する必要がある場合について説明します。

プロジェクトフォルダを少し変更してみましょう:

.
├── .env
├── docker-compose.yaml
├── jupyterhub
│   ├── Dockerfile
│   ├── jupyterhub_config.py
└── nginx
    └── nginx.conf

3 directories, 5 files

Docker構成(群れ)

docker-compose.yamlの方法は次のとおりです ファイルは次のようになります:

version: "3.7"
services:
  # Configuration for reverse proxy
  nginx:
    image: nginx:alpine
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
    ports:
      - 8080:8080
    networks:
      default:
      jupyterhub_network:
        aliases:
          - nginx
  # Configuration for Hub+Proxy
  jupyterhub:
    env_file: .env
    build: jupyterhub
    image: jupyterhub_customized
    hostname: jupyterhub
    volumes:
      - "./jupyterhub/jupyterhub_config.py:/srv/jupyterhub/jupyterhub_config.py:ro"
      - "/var/run/docker.sock:/var/run/docker.sock"
    ports:
      - 8000:8000
    networks:
      default:
      jupyterhub_network:
        aliases:
          - jupyterhub
    environment:
      # Name of the Docker image for the single-user servers
      DOCKER_JUPYTER_IMAGE: ${DOCKER_JUPYTER_IMAGE}
      # The name of the Docker network used by the services
      DOCKER_NETWORK_NAME: ${COMPOSE_PROJECT_NAME}_jupyterhub_network
      # The IP address of the Hub service within the docker network
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.role == manager

  # Configuration for the single-user servers
  jupyterlab:
    image: ${DOCKER_JUPYTER_IMAGE}
    command: echo

networks:
  jupyterhub_network:
    driver: overlay

volumes:
  jupyterhub_data:

Docker-compose環境変数は、.envで定義されています。 ファイル:

# Name of our Docker Compose project
COMPOSE_PROJECT_NAME="jupyterhub"
DOCKER_JUPYTER_IMAGE="jupyterhub/singleuser:2.2"

JupyterHub構成(群れ)

独自のJupyterHubのカスタムイメージを作成して、dockerspawner、dummyauthenticator、およびその他の必要なモジュールを自動的に含める必要があります(たとえば、さまざまな認証方法をサポートするため)。

# Do not forget to pin down the version
FROM jupyterhub/jupyterhub

# Install dependencies (for advanced authentication and spawning)
RUN pip install \
    dockerspawner \
    jupyterhub-dummyauthenticator

また、JupyterHubの正しい構成を提供する必要があります:

import os

NETWORK_NAME = os.environ['DOCKER_NETWORK_NAME']
DOCKER_JUPYTER_IMAGE = os.environ['DOCKER_JUPYTER_IMAGE']

# get the config object
c = get_config()

c.ConfigurableHTTPProxy.should_start = True

c.JupyterHub.authenticator_class = 'dummyauthenticator.DummyAuthenticator'

c.JupyterHub.hub_ip = '0.0.0.0'
c.JupyterHub.hub_connect_ip = 'jupyterhub'

c.JupyterHub.spawner_class = 'dockerspawner.SwarmSpawner'
c.JupyterHub.tornado_settings = {'slow_spawn_timeout': 30}

c.SwarmSpawner.image = DOCKER_JUPYTER_IMAGE
c.SwarmSpawner.network_name = NETWORK_NAME
c.SwarmSpawner.remove_containers = True
c.Spawner.cmd = ["jupyter", "labhub"]
c.Spawner.args = ['--allow-root']
c.Spawner.notebook_dir = '~/'
c.Spawner.debug = True
c.SwarmSpawner.debug = True
c.SwarmSpawner.host_ip = '0.0.0.0'
c.SwarmSpawner.http_timeout = 300
c.SwarmSpawner.start_timeout = 300

#c.JupyterHub.log_level = 00
#c.ConfigurableHTTPProxy.debug = True

詳細については、次のリンクを確認することを強くお勧めします。

  • SwarmSpawnerの使用(公式例)
  • SwarmSpawnerの公式ドキュメント(JupyterHub)
  • Dockerを使用したコンテナ化されたJupyterHubサーバーのデプロイ(記事)
  • swarmSpawnerを使用してDockerSwarm環境でJupyterHubを実行する方法(記事)

Nginx構成(スウォーム)

Nginxの構成は変更されませんが、例を完全にするためにここに配置しましょう:

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;

    upstream ml {
        server jupyterhub:8000;
    }

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        listen 8080;

        location / {
            proxy_pass http://ml;

            proxy_redirect   off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # websocket headers
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }

}
デモの例

提供されたデモを起動するには、次のコマンドを実行します。

docker-compose build

docker-compose up

サービスが開始したらすぐに、サーバーの外部IPアドレスをポート8080に接続します。

次のコンソール出力が表示されます。

ブラウザに次のページが表示されます:

任意のユーザー名を使用し、パスワードは指定しないでください。 サインインをクリックします ボタンをクリックすると、ユーザーラボ環境にリダイレクトされます:

概要

この小さなメモが時間を節約するのに役立つことを願っています。役に立ったと思ったら、世界に広めるのを手伝ってください!

しばらくお待ちください!


Docker
  1. Nginxリバースプロキシを設定する方法

  2. Debian10でJirafeauを使用してファイル共有Webサイトをセットアップする方法

  3. プロキシを使用するように docker を構成する方法

  1. Dockerを使用してマイクロサービスをデプロイする方法

  2. LinodeにDockerを使用してnginxコンテナをデプロイする方法

  3. DockerコンテナにシンプルなApacheWebサーバーをセットアップする方法

  1. DockerにNGINXリバースプロキシをデプロイする方法

  2. Debian10LinuxにNginxをインストールする方法

  3. Kubernetes(k8s)でプライベートDockerレジストリを設定する方法