GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Docker – Cara mengatur Jupyter di belakang proxy Nginx

Artikel ini menjelaskan cara mengkonfigurasi Jupyter di belakang proxy terbalik Nginx, karena konfigurasi seperti itu tidak terlalu jelas bagi banyak orang. Ada banyak masalah dan inti di GitHub, dan sulit untuk memilih solusi yang tepat untuk masalah ini. Selain itu, Anda mungkin menemukan banyak artikel berbeda yang menjelaskan cara melakukannya, tetapi kebanyakan sudah usang dan tidak mencakup konfigurasi CORS dengan baik.

Karena topiknya masih trendi, saya memutuskan untuk memperbarui artikel dan menyederhanakan konfigurasi.

Terima kasih atas komentar Anda di bawah, Andrew Barker . Tangkap versi artikel yang diperbarui.

Konfigurasi buruh pelabuhan

Di bagian artikel ini, kami akan membahas kasus ketika Anda mungkin perlu meluncurkan Jupyter atau JupyterHub di lingkungan Docker biasa.

Konfigurasi JupyterHub

Pertama, mari buat folder tempat kita akan meletakkan semua file konfigurasi.

Inilah struktur akhir kami:

mkdir docker
tree docker

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

Tulisan Docker

Untuk menyederhanakan semuanya, saya membuat docker-compose.yaml , yang menjelaskan layanan kami:

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"

Konfigurasinya mudah – container Nginx Docker kecil sederhana di depan Jupyterhub.

Keduanya diluncurkan dari versi terbaru mereka.

Konfigurasi Nginx

Nginx duduk di port 8080 dan mendengarkan di port 8080 juga.

SANGAT PENTING: nginx.conf berisi konfigurasi proxy terbalik.

Jika Nginx Anda menggunakan port selain 80 atau 443 , Anda perlu menggunakan arahan konfigurasi berikut:

  • proxy_set_header Host $host:$server_port;

Untuk Nginx, yang berada di port default, gunakan default konfigurasi:

  • proxy_set_header Host $host;

Jika Anda membuat kesalahan di sini, Anda akan mulai menerima Blocking Cross Origin API request for /api/contents pesan kesalahan.

Sekali lagi, alasan utama untuk pesan ini bukanlah port yang sama untuk pengikatan layanan dan ekspor untuk kontainer Nginx.

Ini nginx.conf saya untuk mendengarkan di port 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;
        }
    }

}

Konfigurasi Jupyter

Untuk konfigurasi JupyterHub, kami akan menggunakan konfigurasi berikut yang ditempatkan ke /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 = '~/'

Meluncurkan Jupyrter di belakang Proxy Nginx

Saya tidak punya banyak waktu untuk membuat wadah baru dan/atau bermain dengan pengaturan otentikasi pengguna. Tujuan utamanya adalah memberikan solusi untuk Memblokir permintaan Cross-Origin API untuk /api/contents masalah.

Jadi, inilah cara Anda meluncurkan konfigurasi ini:

docker-compose up -d

Hubungkan ke penampung yang baru saja diluncurkan dan buat pengguna serta instal notebook paket:

docker exec -it jupyterhub /bin/bash

adduser 

pip install notebook

Sekarang Anda dapat terhubung ke JupterHub dan menggunakan nama pengguna dan kata sandi yang Anda buat sebagai kredensial masuk.

Konfigurasi Docker Swarm

Di bagian artikel ini, kami akan membahas kasus saat Anda mungkin perlu meluncurkan Jupyter atau JupyterHub dalam mode Docker Swarm.

Mari kita sedikit memodifikasi folder proyek kita:

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

3 directories, 5 files

Tulisan Docker (Swarm)

Begini cara docker-compose.yaml kami file akan terlihat seperti:

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:

Variabel lingkungan komposisi Docker didefinisikan di .env berkas:

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

Konfigurasi JupyterHub (swarm)

Kita perlu membuat image JupyterHub kustom kita sendiri untuk secara otomatis menyertakan dockerspawner, dummyauthenticator, dan modul lain yang mungkin Anda perlukan (misalnya, untuk mendukung metode autentikasi yang berbeda).

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

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

Kami juga perlu menyediakan konfigurasi yang benar untuk 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

Untuk informasi lebih lanjut, saya sangat menyarankan Anda untuk memeriksa tautan berikut:

  • Menggunakan SwarmSpawner (contoh resmi)
  • Dokumentasi resmi SwarmSpawner (JupyterHub)
  • Menerapkan server JupyterHub dalam container dengan Docker (artikel)
  • Cara menjalankan JupyterHub di lingkungan docker swarm menggunakan swarmSpawner (artikel)

Konfigurasi Nginx (swarm)

Konfigurasi Nginx akan tetap tidak berubah, tetapi mari kita taruh di sini untuk kelengkapan contoh:

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

}

Contoh demo

Untuk meluncurkan demo yang disediakan, jalankan perintah berikut:

docker-compose build

docker-compose up

Segera setelah layanan dimulai, sambungkan ke alamat IP eksternal server Anda ke port 8080:

Anda akan melihat keluaran konsol berikut:

Di browser Anda akan melihat halaman berikut:

Gunakan nama pengguna apa pun dan jangan berikan kata sandi apa pun. Klik tombol Masuk tombol dan Anda akan diarahkan ke lingkungan lab pengguna:

Ringkasan

Saya harap catatan kecil ini akan membantu Anda menghemat waktu. Jika menurut Anda bermanfaat, tolong bantu sebarkan ke seluruh dunia!

Tetap disini!


Docker
  1. Cara Mengatur Proksi Terbalik Nginx

  2. Cara Menyebarkan Layanan Mikro dengan Docker

  3. Cara Menyebarkan Wadah nginx dengan Docker di Linode

  1. Cara Mengatur Situs Web Berbagi File dengan Jirafeau di Debian 10

  2. Cara Mengatur Server Web Apache Sederhana di Wadah Docker

  3. Cara mengkonfigurasi buruh pelabuhan untuk menggunakan proxy

  1. Cara Menyebarkan Proksi Terbalik NGINX di Docker

  2. Cara Menginstal Nginx di Debian 10 Linux

  3. Cara Mengatur Registri Docker Pribadi di Kubernetes (k8s)