Docker for Mac で Jupyter 環境を整える

# 概要

Python に加えて Julia もよく使うようになってきたので、まとめてインストールできる手順を確立しておきたい。
今回はホストに Mac を使ったが、Docker をインストールしたあとのコマンドは、どの OS でもだいたい同じ。

Docker で　datascience-notebook イメージを使う。
[Jupyter Notebook Data Science Stack](https://github.com/jupyter/docker-stacks/tree/master/datascience-notebook)
[docker-stacks](https://github.com/jupyter/docker-stacks)

利点

- Julia, Python, R をまとめて入れられる
- どれも Jupyter のカーネルとして一元的にアクセスできる
- 動画作成に使う ffmpeg が標準で入っている
- 他のツールも入れやすい
- いつでも環境をリセットできる

# Docker for Mac インストール

[Get started with Docker for Mac](https://docs.docker.com/docker-for-mac/)

```shell
$ docker --version
Docker version 18.03.1-ce, build 9ee9f40
```

パフォーマンス関係の設定

![doc-sett-adv.png](https://qiita-image-store.s3.amazonaws.com/0/202534/e33e15d8-d445-00ca-336a-72e044f15458.png)

# とりあえずコンテナを起動

- パスワードなし（非推奨だが）
- コンテナ名を dsnote にする
- 数 GB のダウンロードあり

```shell
$ docker run -d -p 8888:8888 --name dsnote \
      jupyter/datascience-notebook start-notebook.sh \
      --NotebookApp.token=''
```

コンテナが起動すると、ブラウザからアクセスできる。
http://localhost:8888

Docker の基本操作

```shell
$ docker ps # 起動中のコンテナを表示
$ docker stop dsnote # コンテナを停止
$ docker ps -a # 停止中も含む全コンテナを表示

$ docker start dsnote # コンテナを再開
$ docker exec -it dsnote bash # コンテナ内の bash
% exit # bash を閉じる
$ docker stop dsnote

$ docker rm dsnote # コンテナを削除
```



# 本環境を整える

## コピペ用コマンド

$ ホストのシェル
% コンテナ内のシェル

```shell
$ docker run -d -p 8888:8888 --name dsnote \
      -v $(pwd):/home/jovyan/work:cached \
      --user root -e GRANT_SUDO=yes \
      jupyter/datascience-notebook start-notebook.sh
      
$ docker exec -it --user jovyan dsnote bash

% conda update -n base conda
% jupyter notebook list # token を確認

% sudo apt-get update
% sudo apt-get install zsh # 好きなものをインストールできる

```

```julia:julia-notebook
Pkg.update()
Pkg.add("Plots")

using Plots
gr(size=(400, 300), fmt=:png)
ENV["PLOTS_TEST"] = "true"

x = linspace(0, 2, 100)
y = sin.(pi*x)
plot(x, y)
```

## オプションの説明

デフォルトユーザが　jovyan という名前になる

**-p 8888:8888**
ホスト port:8888 をコンテナ port:8888 に転送

**--name dsnote**
コンテナ名を指定

**-v $(pwd):/home/jovyan/work:cached**
ホストの現在ディレクトリをコンテナ内 /home/jovyan/work にマウント
cached は consistency を犠牲にしてパフォーマンス向上（Mac のみ？）
[Performance tuning for volume mounts (shared filesystems)](https://docs.docker.com/docker-for-mac/osxfs-caching/#cached)

**--user root -e GRANT_SUDO=yes**
jovyan で `sudo` できるようになる

最初に token を確認してブラウザからアクセスしたら、クッキーに保存されて、二回目以降は認証が要らないので楽。

# マルチプロセスのカーネルを導入

[Jupyter Notebook へのカーネルの追加方法](http://nbviewer.jupyter.org/gist/genkuroki/81de23edcae631a995e19a2ecf946a4f#Jupyter-Notebook-%E3%81%B8%E3%81%AE%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0%E6%96%B9%E6%B3%95)
[Installing additional Julia kernels](https://github.com/JuliaLang/IJulia.jl#installing-additional-julia-kernels)
[Getting Started, Julia Manual](https://docs.julialang.org/en/stable/manual/getting-started/)
[Parallel Map and Loops, Parallel Computing](https://docs.julialang.org/en/stable/manual/parallel-computing#Parallel-Map-and-Loops-1)

```julia:julia-notebook
using IJulia

# -p, --procs {N|auto}
#    Integer value N launches N additional local worker processes
#    "auto" launches as many workers as the number of local cores
IJulia.installkernel("Julia procs", "-p", "auto")

# カーネル変更後
procs() # プロセスのリスト

# コイントス
nheads = @parallel (+) for i = 1:200000000
    Int(rand(Bool))
end
```

下記のファイルが自動的に生成される
`/home/jovyan/.local/share/jupyter/kernels/julia-procs-0.6/kernel.json`

```json:kernel.json
{
  "display_name": "Julia procs 0.6.2",
  "argv": [
    "/opt/julia-0.6.2/bin/julia",
    "-i",
    "--startup-file=yes",
    "--color=yes",
    "-p",
    "auto",
    "/opt/julia/v0.6/IJulia/src/../src/kernel.jl",
    "{connection_file}"
  ],
  "language": "julia"
}
```

# 自動的に再起動（5/9 追記）

PC　起動時に自動的に起動してほしい
[[Docker] 起動中のコンテナに --restart=always オプションを後から適用する](https://qiita.com/suzuki86/items/3b6d5b3a6e83a82c4f28)
[Restart policies (--restart)](https://docs.docker.com/engine/reference/run/#restart-policies---restart)

```shell
$ docker update --restart=unless-stopped dsnote
```

# iTerm で自動ログイン（5/9 追記）

![iterm-dsnote.png](https://qiita-image-store.s3.amazonaws.com/0/202534/c68cbdcf-7e60-b5f8-e6c9-4c2f5572b8ba.png)

# Julia 0.6.3 対応

自分で Dockerfile をつくった。
Plots 系 (PyPlot も含めて) ビルド済み。

https://github.com/Lirimy/julia-docker