JupyterHubをDockerで建ててみる


## まえおき
[PyCon 2015](https://pycon.jp/2015/ja/)で、いろんな人が、iPython(Jupyter) Notebookは欠かせない！って言うてたので、とりあえずインストールしてみようと思ったのですが、DockerでJupyter鯖たててみたっていう日本語情報がわりとすくなかったので、作業した記録を共有してみます。

## dockerのインストール

Debian 8 (Jassie)が母艦なので、

```
$ sudo apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
```

```bash:/etc/apt/sources.list.d/docker.list
# Debian Jessie
deb https://apt.dockerproject.org/repo debian-jessie main
```


```
$ sudo apt-get update
$ sudo apt-get install docker-engine
$ sudo usermod -a -G docker yi01
```

※ yi01 は私のユーザ名です。適宜よみかえてください。


## JupyterHubのDockerイメージの作成

ここには若干罠があります。

まず、Docker Hubに上がっている

* [jupyter/jupyterhub](https://hub.docker.com/r/jupyter/jupyterhub/)

は、認証まわりの実装がなく、`jupyterhub_config.py`を作って dockerの`-v`オプションなどをつかって認証方法などを定義する必要があります。


が、１からいろいろつくるのは面倒なので、jupyterが用意してくれてる[GitHubのOAuthを使うexample](https://github.com/jupyter/oauthenticator/tree/master/example)を使います。

```
$ git clone https://github.com/jupyter/oauthenticator.git
$ cd oauthenticator
```

で、READMEにしたがい、userlistを編集します。

```diff:GitHubのユーザ設定
diff --git a/example/addusers.sh b/example/addusers.sh
index eb2d86b..cedd272 100644
--- a/example/addusers.sh
+++ b/example/addusers.sh
@@ -7,6 +7,6 @@ for line in `cat userlist`; do
   user=`echo $line | cut -f 1 -d' '`
   echo "adding user $user"
   useradd -m -s /bin/bash $user
-  cp -r /srv/ipython/examples /home/$user/examples
-  chown -R $user /home/$user/examples
+#  cp -r /srv/ipython/examples /home/$user/examples
+#  chown -R $user /home/$user/examples
 done
diff --git a/example/userlist b/example/userlist
index e69de29..d8f3556 100644
--- a/example/userlist
+++ b/example/userlist
@@ -0,0 +1 @@
+YusukeIwaki admin
```

注意点としては、userlistを編集するだけだと、`docker build`で

```
cp: cannot stat ‘/srv/ipython/examples’: No such file or directory
chown: cannot access ‘/home/YusukeIwaki/examples’: No such file or directory
```
こんな感じのエラーがでてコケちゃうので、シェルスクリプトもちょっとだけ編集します。
編集を終えたら、

```
$ cd example
$ docker build -t jupyter/oauthenticator .
```

で、Succeedっぽいログが出たら、

```bash:かくにん
$ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
jupyter/oauthenticator   latest              209358b449b6        24 seconds ago      934.9 MB
jupyter/jupyterhub       latest              fd5445f17a96        5 days ago          934.8 MB
```

## GitHubのOAuth設定

[GitHubの設定画面](https://github.com/settings/applications/new)で
![スクリーンショット 2015-10-12 1.14.29.png](https://qiita-image-store.s3.amazonaws.com/0/74571/99f32f97-c1fa-ad0a-50b0-7ae7e174c80c.png "スクリーンショット 2015-10-12 1.14.29.png")

こんな感じで設定します。
コールバックのホスト名やポート番号は、適宜よみかえてやってください。
GitHubサイト側でOAuthの認証情報の登録がおわったら、そこで得られたClientIDとシークレットを


```diff:ひみつ
diff --git a/example/env b/example/env
index 9f32b5c..7a921da 100644
--- a/example/env
+++ b/example/env
@@ -1,5 +1,5 @@
 # add your github oauth config to this file,
 # and run the container with `docker run -it -p 9000:8000 --env-file=env jupyter/oauthenticator`
-GITHUB_CLIENT_ID=
-GITHUB_CLIENT_SECRET=
-OAUTH_CALLBACK_URL=
+GITHUB_CLIENT_ID=21d***********e7a3
+GITHUB_CLIENT_SECRET=2ea1f***********************e9da7
+OAUTH_CALLBACK_URL=http://localhost:8001/hub/oauth_callback
```

こんなかんじで設定します。


## 起動

```
$ docker run -it -p 8001:8000 --env-file=env jupyter/oauthenticator
```

で、ブラウザからアクセスすると・・・

![スクリーンショット 2015-10-12 0.13.20.png](https://qiita-image-store.s3.amazonaws.com/0/74571/edcd852a-d6a3-3528-69f9-40ea4852ee75.png "スクリーンショット 2015-10-12 0.13.20.png")



ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!　となります。