Julia+Jupyter Notebook環境をDockerで構築

# 概要
JuliaをJupyter Notebookで使える環境を手軽に再現できるようにするため、Dockerで環境構築していきます。
Jupyter公式のDocker imageをベースにして、データの永続化やパッケージの自動追加をできるようにします。

# 環境
- OS: Ubuntu 18.04
- Docker 18.09.8

# 手順
### 1. [jupyter/datascience-notebook](https://hub.docker.com/r/jupyter/datascience-notebook)を取得

```
docker pull jupyter/datascience-notebook
```

### 2. コンテナを起動  

```
docker run \
       -p 8888:8888 \
       --user root \
       --name mynotebook \
       jupyter/datascience-notebook
```

-pでポート番号、--userでユーザーの指定が必要です。コンテナ名の指定--nameは任意です。

### 3. Jupyter Notebookにアクセス  

```
To access the notebook, open this file in a browser:
        file:///home/jovyan/.local/share/jupyter/runtime/nbserver-17-open.html
Or copy and paste one of these URLs:
        http://df19b359c643:8888/?token=xxxxx
     or http://127.0.0.1:8888/?token=xxxxx
```  
表示されたURLをブラウザで開くとJupyter Notebookが使えます。
ちなみにJuliaだけでなくRとPythonも使用可能です。Jupyter公式のDocker imageについては[このページ](https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html)が詳しいです。

# データの永続化
このままではコンテナでの作業が保存されないので、ローカルのディレクトリをマウントします。

```
docker run -p 8888:8888 \
           -v ~/path/to/directory:/home/jovyan/work \
           --user root \
           --name mynotebook \
           jupyter/datascience-notebook
```

-vでマウントするディレクトリを指定します。ちなみにデフォルトユーザー名であるjovyanとは[jupyterを使う人というような意味のようです](https://github.com/jupyter/docker-stacks/issues/358)。

# パッケージの追加を自動化
### 1. Dockerfileの作成
よく使うパッケージを自動で追加できるようにちょっとしたDockerfileを作成します。
例として[Plots](http://docs.juliaplots.org/latest/)と[DifferentialEquations](http://docs.juliadiffeq.org/latest/index.html)を追加してみます。

```Dockerfile:Dockerfile
FROM jupyter/datascience-notebook
MAINTAINER yoshikiri

# Plotsを追加
RUN julia -e 'using Pkg; Pkg.add("Plots"); using Plots'

# DifferentialEquationsを追加
RUN julia -e 'using Pkg; Pkg.add("DifferentialEquations"); using DifferentialEquations'
```

REPLを起動せずコマンドでjulia文を実行するには-eオプションを使います。

```
julia -e 'println("hello, julia")'
```

### 2. DockerfileからDocker imageを作成

```
docker build -t notebook .
```

上記コマンド実行後、新たにDocker imageが作成されたことが確認できます。imageのバージョンを指定しないとlatestになります。

```
$ docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
notebook                       latest              4233009a8db5        1 minutes ago      5.77GB
```

### 3. Docker imageからコンテナを起動

```
docker run -p 8888:8888 \
           -v ~/path/to/directory:/home/jovyan/work \
           --user root \
           --name mynotebook \
           notebook
```
最後のimage名を変更しただけです。

### 4. コンテナの停止、再起動
コンテナ停止は次のコマンドです。

```
docker stop mynotebook
```

一度コンテナを作成すれば、以降は次のコマンドで表示されるURLにアクセスすればJupyter Notebookを起動できます。

```
docker start mynotebook
docker exec -it mynotebook jupyter notebook list
```


# まとめ
-  jupyter/datascience-notebookでJulia (とR, Python) + Jupyter Notebook環境を構築
-  ボリュームをマウントしてデータを永続化
-  パッケージを自動で追加するDocker imageをDockerfileから作成
- 作成したDockerfileをGitHubなどで共有すれば、どこでも同じ環境を構築可能  

意見や間違いがあればコメントで教えていただけると大変ありがたいです。

# 参考文献
- [Dockerで基本的なData Science環境(Jupyter, Python, R, Julia, 定番ライブラリ)を構築する。](https://qiita.com/y4m3/items/c2703d4e131e05084b7b)
- [Dockerfileを書いてみる](https://qiita.com/nl0_blu/items/1de829288db2670276e8)