JupyterLab を Docker + nginx-proxy で構築する
いつでもどこでもデータ分析ができる環境として JupyterLab を Docker で Nginx のリバースプロキシ経由で動くように構築してみた。
そのときのメモ。
JupyterLab
Jupyter Notebook というノートブックの形式でプログラムとその実行結果、メモなどを残すことができるツールの次世代版らしい JupyterLab。フォルダ表示やタブや分割による複数ノートブックの表示など jupyter Notebook がさらに便利になっている。
ローカル環境で Jupyter Notebook を利用していたけれど、どこからでも利用できるようにVPS上にその環境を構築してみることにした。
構築環境や前提など
- さくらVPS
- CentOS 7
- Docker と docker-compse がインストールされていて利用できること
- nginx-proxy と letsencrypt-nginx-proxy-companion を利用したリバースプロキシを用意していること
リバースプロキシの件は以下あたりが参考になる。
docker-compose.yml
JupyterLab のコンテナ用のフォルダを作成して、その中に docker-compose.yml を作成する。
記載内容は以下。
version: '2'
services:
jupyterlab:
image: jupyter/datascience-notebook:latest
user: root ②
volumes:
- "./work:/home/jovyan/work"
environment:
NB_UID: 1000 ①
NB_GID: 1000 ①
GRANT_SUDO: "yes" ②
VIRTUAL_HOST: jupyterlab.example.com ④
LETSENCRYPT_HOST: jupyterlab.example.com ④
LETSENCRYPT_EMAIL: jupyterlab@example.com ④
LETSENCRYPT_TEST: "false" ④
privileged: true
restart: always
command: start.sh jupyter lab --NotebookApp.token="token" ③
networks:
default:
external:
name: nginx-proxy
JupyterLab のイメージは jupyter – Docker Hub の datascience-notebook を利用した、他のものを利用しても大丈夫なはず。
① 永続化とユーザーグループ権限
永続化のために /home/jovyan/work
を ./work
へマウントしている。その際、コンテナユーザーでの読み書きができるように、NB_UID
と NB_GID
を設定してコンテナのユーザーとグループをホスト側のユーザーとグループになるようにしている。
② sudo権限
また、GRANT_SUDO
を yes にすることで、パスワードなしで sudo を実行できるようにしている。パッケージのインストールなどをできるようにするため。コンテナも user:root 指定が必要。
③ token の設定
初回起動は token をつけず以下のみで $ docker-compose up
する。
command: start.sh jupyter lab
そうすると以下のような感じで起動して ★ の位置に token が表示される。
Starting jupyter_jupyterlab_1 ...
Starting jupyter_jupyterlab_1 ... done
Attaching to jupyter_jupyterlab_1
jupyterlab_1 | Executing the command: jupyter lab --NotebookApp.token=xxxxx <-★
jupyterlab_1 | [I 06:39:05.296 LabApp] http://localhost:8888/?token=...
jupyterlab_1 | [I 06:39:05.296 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
これをメモしておいて③のtoken部分に記載する。そうすることで以後はこのtokenで常に起動するので、ログイン時にそれを入力して入るようにする。
④ VIRTUAL_HOSTなど
nginx-proxy と letsencrypt-nginx-proxy-companion 用にドメインの指定などを実施。 Jupyter 自体に SSL の指定をする方法が用意されているが、これはあくまで Jupyter を直接利用する場合に使う。
今回のように nginx-proxy 経由で行う場合は、通常通り環境変数で記載する。nginx-proxy を別コンテナで動かしているなら、 network 設定も忘れずに。
まとめ
これで、 https 環境での JupyterLab 環境ができあがる。 Terminal 機能もあるので、conda からのパッケージインストールなども行えるので便利。