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