ローカル環境をよごさずに Jupyter で python コードが動く環境を手軽につくる方法

# 概要

- ローカル環境をよごさずに、**python コードが動かせる状態** をつくります
- **所要時間 5分** くらい

- 記事では macbook 上での構築を想定していますが、サーバで起動させブラウザアクセスする場合は `localhost` を任意のサーバに読み替えて実行してください（かつブラウザアクセス可能なポートを設定します）

# Docker のインストール
https://docs.docker.com/docker-for-mac/install/#download-docker-for-mac

- `Get Docker for mac` をクリックして `Docker.dmg` を取得します
- `Docker.dmg` を起動してmac上にインストールします

# Anaconda の docker image でコンテナ起動
## Terminal を起動

## 必要なdocker image をダウンロード
お好みの docker image を取得します、ここでは anaconda3 が入るイメージを使います
https://hub.docker.com/r/continuumio/anaconda3/~/dockerfile/

```Terminal
$ docker pull continuumio/anaconda3
Using default tag: latest
latest: Pulling from continuumio/anaconda3
8ad8b3f87b37: Pull complete 
e8b8d30f7444: Pull complete 
...
Status: Downloaded newer image for continuumio/anaconda3:latest
```

## jupyter notebook が参照する作業ディレクトリを作成

```Terminal
$ mkdir -p $HOME/jupyter-notebook/notebooks
```

## Docker コンテナ起動

```Terminal
$ docker run \
    -d -i -t \
    -p 8888:8888 \
    --name jupyter-notebook \
    -v $HOME/jupyter-notebook/notebooks:/opt/notebooks \
    continuumio/anaconda3 \
    /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --no-browser --allow-root"
```
`-p 8888:xxxx` JupyterNotebookのデフォルト 8888 で都合の悪い場合は、別のポート `xxxx` に置き換えてください


コンテナの状態確認

```
$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
96f9690341ae        continuumio/anaconda3   "/usr/bin/tini -- ..."   6 seconds ago       Up 5 seconds        0.0.0.0:8888->8888/tcp   jupyter-notebook
```

# JupyterNotebook をブラウザから開く

## コンテナ上で起動している JupyterNotebook のURLを取得
`docker logs` コマンドで取得したログに、JupyterNotebook にアクセスするためのトークンつきURLが記録されているので、それを取得します

```Terminal
$ docker logs jupyter-notebook

Fetching package metadata .........
Solving package specifications: .
...
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=a5b5211197b4d9b2f8f93ee73c085786039486369c5bcbec <<<<---- here

```

## アクセスURLをブラウザで開く
取得したURLをブラウザで開きます（ポート変更してる場合は指定の port に読み替えます）

```
http://localhost:8888/?token=a5b5211197b4d9b2f8f93ee73c085786039486369c5bcbec
```

<img width="791" alt="notebook" src="https://qiita-image-store.s3.amazonaws.com/0/35755/1ebb002b-43f5-9735-cff0-5ac75eea492d.png">

ひらきました
まだ何もコードはありません


# コード実行
お好みのコードを作業ディレクトリに配置します
例として [ゼロから作る Deep Learning のリポジトリ](https://github.com/oreilly-japan/deep-learning-from-scratch) を `git clone` してきます

```Terminal
$ cd $HOME/jupyter-notebook/notebooks

$ git clone https://github.com/oreilly-japan/deep-learning-from-scratch.git
Cloning into 'deep-learning-from-scratch'...
remote: Counting objects: 322, done.
remote: Total 322 (delta 0), reused 0 (delta 0), pack-reused 322
Receiving objects: 100% (322/322), 4.87 MiB | 944.00 KiB/s, done.
Resolving deltas: 100% (160/160), done.
Checking connectivity... done.
```

JupyterNotebook 上にすぐ反映されます

<img width="783" alt="JupyterNote からみえます" src="https://qiita-image-store.s3.amazonaws.com/0/35755/1bab8661-e10c-6b3d-366a-86358c7872c2.png">

（取得してきたファイルはテキストファイルなのでそのまま実行はできません）
Jupyter 画面上の `New` プルダウンから `Python3` などの実行ファイルを作成して、実行したいコードを切り貼りするなどして自由にコードを動かしてください

<img width="783" alt="自由にコードを実行します" src="https://qiita-image-store.s3.amazonaws.com/0/35755/cd68d955-82fa-bd33-dcf3-f18ef22c60aa.png">


以上です！ :D

# Docker コンテナがいらなくなったら
`docker stop`, `docker rm` してコンテナを破棄しましょう　:)

```
$ docker ps -a 
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
96f9690341ae        continuumio/anaconda3   "/usr/bin/tini -- ..."   6 seconds ago       Up 5 seconds        0.0.0.0:8888->8888/tcp   jupyter-notebook

$ docker stop 96f9690341ae
$ docker rm 96f9690341ae
```