docker 上で Ubuntu に Jupyterlab をインストールして 自分好みの機械学習環境を手に入れる

# やりたいこと
docker 上で Ubuntu に Jupyterlab をインストールして 自分好みの機械学習環境を手に入れる

* Windows10のdocker上に構築する
* docker上のUbuntuでJupyterlabを動かす
* Pythonおよびライブラリを使う
* Jupyterlabの拡張機能(Extension Manager)を使えるようにする
* ホストOS(Win10)のブラウザからJupyterlabを操作できるようにする
* ホストOSのフォルダと同期
* 日本語名ファイル、フォルダを表示可能にする
* ホストOS起動時にJupterlabが自動起動させる

# 環境

* ホストOS：Windows10 Pro
* Docker desktop:2.1.0.3(38240)
* Docker Engine:19.03.2
* Ubuntu:18.04.3 LTS (Bionic Beaver)
* Jupyterlab:1.1.4
* python:18.04.3 LTS (Bionic Beaver)

# 前提
* Windows10にDockerがインストールされていること
* Dockerコンテナの起動、停止可能な程度の操作ができること

# 手順
1. Ubuntu を Pull する
2. Dockerファイルの作成
3. imageの作成
4. コンテナの作成
5. Jupyterlabへアクセス
6. Jupyterlabの拡張機能追加

# 内容
### 1. Ubuntu を Pull する
Windows PowerShellを起動してDockerからUbuntuイメージをPullする。

``` Dockerコマンド
> docker pull ubuntu
```

正しくpullできたか imageコマンドで確認

``` Dockerコマンド
> docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              2ca708c1c9cc        3 weeks ago         64.2MB
```

### 2. Dockerファイルの作成
任意の場所にDockerファイル（ファイル名 拡張子なし:dockerfile）を作成します。

``` dockerfile
FROM ubuntu

RUN apt-get update
RUN apt-get install -y sudo
RUN sudo apt install -y python3-pip
RUN sudo apt install -y nodejs npm
RUN sudo apt install -y language-pack-ja
RUN sudo update-locale LANG=ja_JP.UTF-8
RUN pip3 install jupyterlab
RUN pip3 install pandas
RUN pip3 install matplotlib
RUN pip3 install sklearn
```

nodejs npm はJupyterlabの拡張機能を使用するのに必要です。
Language-pack-ja はフォルダ、ファイル名で日本語を扱う場合に必要です。
pandasなどのライブラリを必要に応じて追加してください。

### 3. imageの作成

作成した Dockerfile からdocker image を作成するため、
DockerFileのあるフォルダへ PowerShell のカレントフォルダを移動し、
docker buildコマンドを実行します。

``` Dockerコマンド
docker build -t myjupyterlab:latest ./
```
書式（一部）：docker build [オプション] 作成するコンテナ名[:タグ名] dockerfileのパス

| オプション | 内容 |
|:---------------------------------------|:---------------------------------------|
| -t | 作成するコンテナ名[:タグ名] 形式でimage名をタグ名を設定します。  |

### 4. コンテナの作成
Dockerのrunコマンドを実行してコンテナを作成します。

``` Dockerコマンド
> docker run -e LANG=ja_JP.UTF-8 -it -p 8888:8888 -v C:/Users/xxx/Documents/jupyterNotebook:/home/jovyan/work myjupyterlab jupyter lab --allow-root --ip=0.0.0.0 --no-browser
```
書式（一部）：docker run [オプション] [image名] [コンテナ内の実行コマンドとその引数]

| オプション | 内容 |
|:---------------------------------------|:---------------------------------------|
| -e |  環境変数を設定します。ここでは言語に日本語を設定しています。 |
| -it  | -i と -t のこと  |
| -i  | 接続されていなくてもSTDIN(標準入力)を開いたままにします  |
| -t  | 擬似TTYを割り当てる  |
| -p  |  コンテナのポートをホストに公開します。 hostポート:コンテナポート |
| -v  |  ホストのフォルダをコンテナへマウントします。 hostフォルダ:コンテナフォルダ |

これだけだと、ホストOSを再起動した際にコンテナが自動起動されないので、以下のコマンドを打っておきます。

``` Dockerコマンド
docker update --restart=always コンテナ名
```

### 5. Jupyterlabへアクセス
ホストOSのブラウザを起動し、 "http://localhost:8888" で、jupyterlabへアクセスできることを確認します。

### 6. Jupyterlabの拡張機能追加
無事にアクセスできたら、Jupyterlabの拡張機能を有効にします。
[Settings] - [Enable Extension Manager(experimental)] にチェックを入れます。
すると左側にパズルピースアイコンが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/d3b17612-ab57-bedf-ac27-5f44c1f0986f.png)
それを選択し、検索ボックスにインストールしたい拡張モジュール名をを入れると検索されます。"Install" をクリックすることでインストールされます。

おすすめの 拡張機能は、
Qiita : [JupyterLabのおすすめ拡張機能7選](https://qiita.com/canonrock16/items/d166c93087a4aafd2db4)
を参考にしてください。