GNU/Linux >> Znalost Linux >  >> Panels >> Docker

Docker – Jak nastavit Jupyter za proxy Nginx

Tento článek popisuje, jak nakonfigurovat Jupyter za reverzní proxy Nginx, protože taková konfigurace není pro mnoho lidí příliš zřejmá. Na GitHubu je mnoho problémů a podstat a je těžké vybrat správné řešení tohoto problému. Také můžete najít mnoho různých článků popisujících, jak to udělat, ale většina z nich je zastaralá a nepokrývá dobře konfiguraci CORS.

Jelikož je téma stále trendy, rozhodl jsem se článek obnovit a zjednodušit konfiguraci.

Děkujeme za vaše komentáře níže, Andrew Barker . Podívejte se na aktualizovanou verzi článku.

Konfigurace dockeru

V této části článku se budeme zabývat případem, kdy možná budete muset spustit Jupyter nebo JupyterHub v běžném prostředí Docker.

Konfigurace JupyterHub

Nejprve si vytvořte složku, do které vložíme všechny naše konfigurační soubory.

Zde je naše konečná struktura:

mkdir docker
tree docker

docker
├── docker-compose.yaml
├── jupyter_notebook_config.py
└── nginx.conf

Docker Compose

Abych vše zjednodušil, vytvořil jsem docker-compose.yaml , který popisuje naše služby:

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"

Konfigurace je přímočará – jednoduchý malý kontejner Nginx Docker před Jupyterhub.

Oba byly spuštěny ze svých nejnovějších verzí.

Konfigurace Nginx

Nginx sedí na portu 8080 a poslech na portu 8080 také.

VELMI DŮLEŽITÉ: nginx.conf obsahuje konfiguraci reverzního proxy.

Pokud váš Nginx sedí na jiném portu než 80 nebo 443 , musíte použít následující konfigurační direktivu:

  • proxy_set_header Host $host:$server_port;

Pro Nginx, který je umístěn na výchozích portech, použijte default konfigurace:

  • proxy_set_header Host $host;

Pokud zde uděláte chybu, začnete dostávat Blocking Cross Origin API request for /api/contents chybové zprávy.

Opět platí, že hlavním důvodem těchto zpráv nejsou stejné porty pro vazbu služby a export pro kontejnery Nginx.

Zde je můj nginx.conf pro poslech na portu 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;
        }
    }

}

Konfigurace Jupyter

Pro konfiguraci JupyterHub použijeme následující konfiguraci umístěnou v /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 = '~/'

Spouštění Jupyrteru za Nginx Proxy

Neměl jsem moc času postavit nový kontejner a/nebo si hrát s nastavením ověřování uživatelů. Hlavním účelem je poskytnout řešení pro Blocking Cross-Origin API request for /api/contents problémy.

Zde je návod, jak můžete tuto konfiguraci spustit:

docker-compose up -d

Připojte se k právě spuštěným kontejnerům, vytvořte uživatele a nainstalujte notebook balíček:

docker exec -it jupyterhub /bin/bash

adduser 

pip install notebook

Nyní se můžete připojit k JupterHub a použít vytvořené uživatelské jméno a heslo jako přihlašovací údaje.

Konfigurace Docker Swarm

V této části článku se budeme zabývat případem, kdy možná budete muset spustit Jupyter nebo JupyterHub v režimu Docker Swarm.

Pojďme trochu upravit naši složku projektu:

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

3 directories, 5 files

Docker Compose (Swarm)

Zde je návod, jak funguje náš docker-compose.yaml soubor bude vypadat takto:

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:

Proměnné prostředí Docker-compose jsou definovány v .env soubor:

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

Konfigurace JupyterHub (swarm)

Potřebujeme vytvořit vlastní image JupyterHub, aby automaticky zahrnoval dockerspawner, dummyauthenticator a další moduly, které byste mohli potřebovat (například pro podporu různých metod ověřování).

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

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

Potřebujeme také poskytnout správnou konfiguraci pro 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

Pro více informací důrazně doporučuji, abyste se podívali na následující odkazy:

  • Použití SwarmSpawner (oficiální příklad)
  • Oficiální dokumentace SwarmSpawner (JupyterHub)
  • Nasazení kontejnerového serveru JupyterHub s Dockerem (článek)
  • Jak spustit JupyterHub v prostředí docker swarm pomocí swarmSpawner (článek)

Konfigurace Nginx (roj)

Konfigurace Nginx zůstane nezměněna, ale pro úplnost příkladu ji uveďme sem:

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;
        }
    }

}

Příklad ukázky

Chcete-li spustit poskytnuté demo, spusťte následující příkaz:

docker-compose build

docker-compose up

Jakmile se služba spustí, připojte se k externí IP adrese vašeho serveru k portu 8080:

Měli byste vidět následující výstup konzoly:

V prohlížeči byste měli vidět následující stránku:

Použijte libovolné uživatelské jméno a neuvádějte žádné heslo. Klikněte na tlačítko Přihlásit se a budete přesměrováni do prostředí uživatelské laboratoře:

Shrnutí

Doufám, že vám tato malá poznámka pomůže ušetřit čas. Pokud to považujete za užitečné, pomozte to rozšířit do světa!

Zůstaňte naladěni!


Docker
  1. Jak nastavit reverzní proxy Nginx

  2. Jak nastavit web pro sdílení souborů s Jirafeau na Debianu 10

  3. Jak nastavit jednoduchý webový server Apache v kontejneru Docker

  1. Jak nasadit mikroslužby s Dockerem

  2. Jak nasadit kontejner nginx s Dockerem na Linode

  3. Jak nakonfigurovat docker pro použití proxy

  1. Jak nasadit NGINX Reverse Proxy na Docker

  2. Jak nainstalovat Nginx na Debian 10 Linux

  3. Jak nastavit soukromý registr dockerů v Kubernetes (k8s)