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の利用を検討してください!

コメント