バイオとインフォと

バイオとインフォで食べていきたい研究員の技術ブログ

Docker+JupyterHubを使ったハンズオンセミナー用環境構築

概要

昔、身内数名でのハンズオンセミナー用にDocker+JupyterHubで環境構築をした話です。コードはここです↓ github.com

この記事について

これはkyoto.bioinfoアドベントカレンダーの記事です。京都大好き! adventar.org

目的・動機

昨今の世情から、コーディングを始めたい(始めざるをえない)人向けの教育プログラムが求められています。バイオ界隈も例外ではありません。

バイオインフォのイニシャルトレーニングは基本的に 放置 OJT方式となりますが、対象者が多い場合にはハンズオン形式のセミナーが選択肢に入ってきます。しかし、初心者を集めてワークショップを開く場合には厄介な問題がいくつも浮上します。まず、参加者の無視できない割合が環境構築で詰まります。また、参加者全員のPCのスペックが要求水準を満たすとは限りません。

そこで、参加者各自のPCを使ってもらうのではなく、どこかのサーバーに全員分の解析環境を用意することで、初心者向けバイオインフォワークショップがパソコン教室と化す問題を回避します。DockerとJupyterHubを用いることで、手軽にスケーラブルなワークショップ用解析環境を構築できます。

Dockerって?

詳しい人たちが書いてくれた解説記事がたくさんあります。ググってください。

JupyterHubって?

複数人で使えるJupyter Notebook環境です。ログイン認証やユーザー管理などの機能が備わっています。各ユーザーはブラウザ経由でログインすることで、何の作業をせずともJupyter Notebookを使うことができます。管理も簡単です。

jupyter.org

JupyterHub環境のdockerfileを書く

少人数(10人以内)でのワークショップを開催する想定で環境を用意します。ラボで余っているそんなにスペックの高くないパソコンをLinuxサーバー化して使う想定です。今回は以下のようなポリシーを掲げました。

  • ワークショップで使うバイオインフォ系ツールを楽にインストールしたいのでcondaで環境をつくる。
  • バイオインフォ系ツールはRで動くものが多いので、JupyterNotebook経由でRを使えるようにする。
  • ワークショップ限定の使い捨て環境として、最小限の機能だけつける。長期運用のことは考えない。

以上のようなことを考えつつdocker imageをつくっていきます。(dockerfileはこちら

ベースのdocker imageについて

事前にubuntu:20.04をdocker pullしておきます。今回はこのdocker imageにJupyterHubなどを入れていきます。

hub.docker.com

Mambaをインストールする

今回はcondaの代わりにmambaを使います。

github.com

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

jupyterhub.readthedocs.io

ワークショップで使うバイオインフォ系パッケージをインストールする

バイオインフォ系パッケージをインストールします。今回は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なども使えるようです↓が、今回はデフォルト設定のまま進めます。参加者が多い場合はユーザー管理と認証方式を工夫した方が良いかもしれません。

github.com

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でお手軽にワークショップ用解析環境ができました。
カスタマイズすれば他に使い道も広がりそうです。

こうするともっと簡単にできるよ!、などコメントあればお願いします。

参考にさせていただいた記事

horomary.hatenablog.com

qiita.com