[Docker] jupyterのリモートアクセスにパスワードを設定する

Jupyterから公式で配布されているimageでは,デフォルトでpython, R, juliaが使えたり,tensorflowの設定がされていたりと便利なimageが多い.しかしながら,defaultのuserはjovyanさんになっている.リモートでjupyterlabにアクセス出来るようにしたいとき,パスワードの設定をしたい.が,なかなかその設定に関する記事がなかったのでこの記事で1つの方法を紹介.

Jupyterにパスワードを設定する

Dockerのimageは,jupyter/base-notebook を用いることとする.
このimageを start.sh jupyter lab をエントリーポイントとして起動させるとトークン付きのurlが出てくるが,それを用いずに127.0.0.1:8888でアクセスしてあげると,下の方にtokenをいれればpasswordを設定出来るようになっている.

そこで,tokenを入れてpasswordを入れてあげる.勝手にjupyter labが起動するので,一旦,logoutしてあげて,パスワードでログイン出来るかなと試してあげると上手く行かない.パスワードの設定をすると,/home/jovyan/.jyupyter のディレクトリーに jupyter_server_config.jsonが出来るがこれが読み込まれていない状態になっている.
コンテナを一度閉じてしまうと,確かにjupyterlabも閉じるが同時にconfigファイルもなくなってしまう.
だったら,configファイルが無くならないようにvolumeの設定で残してあげれば良いじゃないかという発想.

以下が,jupyter labでパスワードを設定するための,docker-compose.yml の一例.notebookディレクトリー以下にnotebookを入れ,configディレクトリーに設定を保持するようにする.

version: "3"
services:
  lab:
    image: jupyter/base-notebook
    ports:
      - "8888:8888"

    volumes:
      - ./notebook:/workdir
      - ./config:/home/jovyan/.jupyter

    command: start.sh jupyter lab


docker-compose upでコンテナを立ち上げる.その後に,127.0.0.1:8888にアクセスして,コンテナを立ち上げた際に表示された 127.0.0.1:8888以降にあるtokenについてtokenの欄に入れ,設定したいパスワードをパスワードの欄に入れてあげる.これでjupyter labに入った後,docker-compose downによってコンテナを閉める.これで,次に立ち上げたときにjupyter_server_config.jsonからファイルを読み込んでくれる.実際,もう一度立ち上げる際には,token付きのurlが表示されなくなるため,ローカルホストにアクセスしてあげるとパスワードを要求される.なので先程入力したパスワードを入れて上げればjupyterlabを動かすことが出来る.

リモートのjupyter labの設定

さて,以上の設定でdockerの設定が完了する.大体においてリモートで動かしたい場合が多いので,ここでは追加でnginxを用いたreverse proxyの設定についても追記しておく.

ここでは,jupyter hubの設定をパクれば良い.sslの設定は面倒なので,セキュリティ的に問題があるのは知っているが,http通信を行う.その際の設定は以下のようになる.

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

server {
    listen 80;
    server_name example.com;
    client_max_body_size 10M;
    proxy_buffers 64 16k;
    proxy_max_temp_file_size 1024m;
    proxy_temp_path nginx_proxy_temp;
    proxy_connect_timeout 5s;
    proxy_send_timeout 10s;
    proxy_read_timeout 10s;

    root /path/to/dir;
    location / {
        proxy_pass http://127.0.0.1:8888;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # websocket headers
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Scheme $scheme;
        
        proxy_buffering off;

    }
}

はい,あとは,docker-compose up -dでバックグラウンドで走らせ,docker logs <container_id/name> でログ見てtokenを取得すればok.

———-雑感(`・ω・´)———-

リモートのjupyterlabに多重アクセスした際の挙動はどうなるか知りません! そのような運用を本格的に考えるならばjupyter hubの利用を検討してください!

docker python
スポンサーリンク
あきとしのスクラップノート

コメント

タイトルとURLをコピーしました