Docker+JupyterHubを使ったハンズオンセミナー用環境構築
概要
昔、身内数名でのハンズオンセミナー用にDocker+JupyterHubで環境構築をした話です。コードはここです↓ github.com
この記事について
これはkyoto.bioinfoアドベントカレンダーの記事です。京都大好き! adventar.org
- 概要
- この記事について
- 目的・動機
- Dockerって?
- JupyterHubって?
- JupyterHub環境のdockerfileを書く
- JupyterHubのconfigファイルの作成
- JupyterHub環境の立ち上げ
- おわりに
- 参考にさせていただいた記事
目的・動機
昨今の世情から、コーディングを始めたい(始めざるをえない)人向けの教育プログラムが求められています。バイオ界隈も例外ではありません。
バイオインフォのイニシャルトレーニングは基本的に 放置 OJT方式となりますが、対象者が多い場合にはハンズオン形式のセミナーが選択肢に入ってきます。しかし、初心者を集めてワークショップを開く場合には厄介な問題がいくつも浮上します。まず、参加者の無視できない割合が環境構築で詰まります。また、参加者全員のPCのスペックが要求水準を満たすとは限りません。
そこで、参加者各自のPCを使ってもらうのではなく、どこかのサーバーに全員分の解析環境を用意することで、初心者向けバイオインフォワークショップがパソコン教室と化す問題を回避します。DockerとJupyterHubを用いることで、手軽にスケーラブルなワークショップ用解析環境を構築できます。
Dockerって?
詳しい人たちが書いてくれた解説記事がたくさんあります。ググってください。
JupyterHubって?
複数人で使えるJupyter Notebook環境です。ログイン認証やユーザー管理などの機能が備わっています。各ユーザーはブラウザ経由でログインすることで、何の作業をせずともJupyter Notebookを使うことができます。管理も簡単です。
JupyterHub環境のdockerfileを書く
少人数(10人以内)でのワークショップを開催する想定で環境を用意します。ラボで余っているそんなにスペックの高くないパソコンをLinuxサーバー化して使う想定です。今回は以下のようなポリシーを掲げました。
- ワークショップで使うバイオインフォ系ツールを楽にインストールしたいのでcondaで環境をつくる。
- バイオインフォ系ツールはRで動くものが多いので、JupyterNotebook経由でRを使えるようにする。
- ワークショップ限定の使い捨て環境として、最小限の機能だけつける。長期運用のことは考えない。
以上のようなことを考えつつdocker imageをつくっていきます。(dockerfileはこちら)
ベースのdocker imageについて
事前にubuntu:20.04をdocker pull
しておきます。今回はこのdocker imageにJupyterHubなどを入れていきます。
Mambaをインストールする
今回はcondaの代わりにmambaを使います。
Mambaをインストールするスクリプトをダウンロードしてbashで実行します。
wget https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh
bash Mambaforge-Linux-x86_64.sh -bup /opt/mambaforge
dockerfile内では-b オプションが必要です。-bを入れずにシェルスクリプトを実行すると対話型のインストールで情報の入力を求められるため、docker build
が止まります。また、/root下ではなく、全ユーザーから見える場所をインストール先に指定する必要があります。
JupyterHubをインストールする
公式のガイダンスに従ってJupyterHub関連のパッケージをインストールします。
pipとnpmを使う方法もありますが、今回は他のバイオインフォ系ツールをインストールしやすいようにconda (mamba) を使う方法をとります。
mamba install -y -c conda-forge jupyterhub jupyterlab notebook jupyter_client
ワークショップで使うバイオインフォ系パッケージをインストールする
バイオインフォ系パッケージをインストールします。今回はtidyverseとDESeq2をインストールします。
mamba install -y -c conda-forge r-tidyverse mamba install -y -c bioconda bioconductor-deseq2
JupyterNotebookからRを使えるようにする
RのIRkernelパッケージをインストールしたあと、RでIRkernel::installspec(user = FALSE)
を実行します。
user = FALSE
のオプションを入れることで、今ログインしているユーザーだけでなく全ユーザーでJupyterNotebookからRを使えるようになります。
mamba install -y -c conda-forge r-irkernel Rscript -e 'IRkernel::installspec(user = FALSE)'
Ubuntu上でユーザーを作成する
JupyterHubのデフォルトのログイン認証方式は、PAM認証(システムのユーザー名とパスワードでログイン)です。
OAuthやLDAPなども使えるようです↓が、今回はデフォルト設定のまま進めます。参加者が多い場合はユーザー管理と認証方式を工夫した方が良いかもしれません。
Ubuntu上でワークショップの参加者数 + 管理者分のユーザーを作成します。
user="<ユーザー名>" pw="<パスワード>" useradd -m $user echo "${user}:${pw}" | chpasswd
各ユーザーディレクトリに "notebook" というディレクトリを作成し、JupyterHubログイン時にここが読み込まれるようにします。ワークショップの教材などをここに置くことで、資料配布の手間が省けます。
mkdir -p -m 777 /home/${user}/notebook chown ${user}: /home/${user}/notebook
以上でdockerfileの説明は終わりです。
JupyterHubのconfigファイルの作成
JupyterHubのconfigファイル (jupyterhub_config.py → こちら) を作っていきます。
各ユーザーのJupyterNotebookの保存先を指定します。
c.Spawner.notebook_dir = '~/notebook'
JupyterHubへログインできるユーザー(Ubuntu上で作成したシステムユーザー)を指定します。
c.Authenticator.admin_users = {'jupyterhub_admin'} c.Authenticator.allowed_users = {'jupyterhub_user1', 'jupyterhub_user2'}
また、dockerfileにCOPY jupyterhub_config.py /
と書いておくことで、作成した "jupyterhub_config.py" がdocker container内にコピーされるようにしておきます。
JupyterHub環境の立ち上げ
作成したdockerfileからdocker imageをビルドします。
docker build . -t jupyterhub_for_bioinfo_workshops
それを立ち上げます。ポート8000が開くので、ポートフォーワーディングしておきます。
docker run -it -p 8000:8000 jupyterhub_for_bioinfo_workshops /bin/bash
bashが立ち上がるのでconda環境を立ち上げてJupyterHubを実行します。
conda activate jupyterhub39 jupyterhub jupyterhub_config.py
ブラウザに "http://localhost:8080" (別のマシンからアクセスする場合は "localhost" の部分をIPアドレスに置き換える)と打ち込みます。
するとログイン画面が立ち上がり、
Ubuntuで作成したユーザー名とパスワードでログインするとJupyterNotebook環境が使えます。
おわりに
Docker+JupyterHubでお手軽にワークショップ用解析環境ができました。
カスタマイズすれば他に使い道も広がりそうです。
こうするともっと簡単にできるよ!、などコメントあればお願いします。