Docker + VSCode + Remote Containerで作る快適Jupyter Lab(Python)分析環境

# この記事はどのような内容？
`Docker` + `VSCode` + `Remote Container`で作るデータ分析環境構築の手順が書いてあります。
## 想定読者
「[Jupyter Lab](https://jupyter.org/)? それとも[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)などのクラウドサービス？...なんか色々あって、Pythonのデータ分析環境わからん！簡単に導入できて、かつそれなりに快適な分析環境を整えたい！」
という方に向けて書きました。

サンプルリポジトリはGitHubにPushしていますので、cloneしてコンテナを立ち上げ、READMEの手順に沿ってリモート接続していただければ、10分程度で環境構築ができます。

https://github.com/hatahata7757/sample-analytical-env

この記事を読んだ方のデータ分析環境の選択に、少しでも貢献できましたら幸いです。

# はじめに
最近、`Python` でデータ分析する機会があり、`Jupyter`が動く環境を構築する必要がありました。

ローカルにJupyter Lab環境を直接構築しても良いのですが、なるべくローカル環境は汚したくないですし、Jupyter LabではVSCodeと違って入力補完等のサポートが弱いので、ちょっと使いにくい。

色々と調べていると、VSCodeの[October-2019-release](https://devblogs.microsoft.com/python/python-in-visual-studio-code-october-2019-release/)で、Microsoft公式の Python 拡張機能が、`.ipynb`(Ipython notebook専用ファイル)をサポートしていたことを知りました。よって、コーディング環境はJupyter Labではなくインテリセンスなどが効く`VSCode`を選択。

仮想環境も、Jupyter LabのDockerイメージがDocker Hubに[pushされている](https://hub.docker.com/r/jupyter/datascience-notebook)ことを知ったので、pullしてこれば手軽に環境構築ができそうです。

ということで、

- **仮想環境**は、`Jupyter Lab`の`Docker`イメージを使う

- `Remote Container`を使って、**起動したコンテナにリモート接続**

- Remote Containerで接続したワークスペース内で、**入力補完やLinterを効かせながらコーディング**

上記のような環境をデータ分析環境として選択しました。
イメージはこのような感じです。
![Screenshot 2020-12-26 15.17.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/88b70dcb-3e9c-b7d0-5572-92315d9177aa.png)


# Docker + VSCode + Remote Containerで作るJupyter Lab(Python)分析環境構築
以下の内容は、自分で環境構築をされる方用に、少し細かく説明したものになります。

この記事の上部に載せたリポジトリには、必要拡張機能や各種設定を`.vscode/settings.json`・`.devcontainer/devcontainer.json`に記述 & 最低限の手順をREADMEに記載しておりますので、以下手順を読む必要がないようにしてあります。

# 動作環境
<img src="https://img.shields.io/badge/Docker Desktop for Mac-3.3.1-2496ED.svg?logo=docker&style=plastic"> <img src="https://img.shields.io/badge/Docker Engine-20.10.5-2496ED.svg?logo=docker&style=plastic"> <img src="https://img.shields.io/badge/MacOS Catalina-10.15.7-999999.svg?logo=apple&style=plastic">

##  Docker
他の方が書かれた記事：[【Docker】3分でjupyterLab(python)環境を作る！](https://qiita.com/hgaiji/items/edf71435d0565257f980)を参考に...というか丸パクリなのですが、`docker-compose.yml`に、Jupyter Lab環境構築に必要な設定を記述します。

```yml:docker-compose.yml
version: '3'
services:
  notebook:
    image: jupyter/datascience-notebook
    ports:
      - '8888:8888'
    environment:
      - JUPYTER_ENABLE_LAB=yes
    volumes:
      - ./work:/home/jovyan/work
    command: start-notebook.sh --NotebookApp.token=''
```
`volumes`にhome/ 以下にjovyan という名前でディレクトリを切っておりますが、`jovyan`は Jupyter Notebookを使用する人々全員 という意味があるそうです。

>参考:

>- [サーバーのDockerで起動したJupyter Notebookを他のパソコンからアクセスできるようにした話](https://qiita.com/yamasakih/items/d23ac0bf773e9b1b4d9d)

>- [Who is jovyan? #358](https://github.com/jupyter/docker-stacks/issues/358)

これで、Jupyter Labが動く環境が用意できました。
## Remote Container
このまま`docker-compose up -d`でコンテナを立ち上げれば、http://localhost:8888 にアクセスしてJupyter Labでコーディングできます。

別にそれでも良いのですが、VSCodeの入力補完などの強力な拡張機能の恩恵を受けたいため、`Remote Container`で**立ち上げたコンテナにリモート接続し、VSCodeでコーディング**したいと思います。
Remote Containerに関しては、調べると他の方が詳しく説明をしてくださっていますので、そちらをご参照ください。

参考：[VSCode Remote Containerが良い](https://qiita.com/d0ne1s/items/d2649801c6f804019db7)

### Remote Containerの設定
VSCode [設定]→[拡張機能]→[Remote Container]:インストール。

インストールすると、「Reopen in Container」というポップアップが表示されるので、選択。

![Screenshot 2020-12-27 17.10.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/b856323b-deef-d50b-ae2f-b74849249433.png)



すると、プロジェクトの`docker-compose.yml`の設定に基づいたコンテナを自動的にbuild & 起動してくれ、コンテナの中でVSCodeのワークスペースが開かれます。

（二回目以降は、VSCode左下の「><」みたいなマーク→reopen in Containerで接続できます。）
![Screenshot 2020-12-27 17.09.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/76c63881-391d-d4d8-e730-08fd00318426.png)


ワークスペース内では、ターミナルもコンテナのシェルと接続されているため、コマンドなどを流す際にいちいち`docker-compose ~`（もしくはエイリアス）をつける必要はありません。

ワークスペースを開くと、「No Python interpreter is selected...」といったポップアップが表示されます。これは、Pythonの実行環境を聞いてきているので、Jupyter Labの実行環境である`conda`環境「**Python 3.xx 64-bit('conda': virtualenv)**」を選択。
![Screenshot 2020-12-27 17.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/a93554ea-243e-24e2-f93d-6fe66a7fc514.png)

## VSCode
起動したコンテナにリモート接続し、コンテナの中でVSCodeが開ける状態になりました。
ただ、このまま`.ipynb`を開いてもIPython Notebook用の表示にならないため、ワークスペースに拡張機能を追加します。

ワークスペース内で[拡張機能]→[python(ms-python.python)]を探し、Dev Container: [プロジェクト名にインストールする]を選択。これで、IPython Notebook用の表示になります。
![Screenshot 2020-12-26 15.10.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/1e1fb57b-188b-563b-ef49-c6c5c967a80f.png)

他にも、LinterやIntelliSense系の各種拡張機能を、適宜ワークスペースにインストールしてください。`.devcontainer/devcontainer.json`内の`extensions`に拡張機能を記載しておけば、ワークスペース起動時に自動的に読み込んでくれるので、プロジェクトの配布時などに便利です。

>（※「はじめに」に載せたリポジトリには、python (ms-python.python）と自動インポート機能・型チェック機能をサポートしているpylance (ms-python.vscode-pylance)が読み込まれるように設定しています）

最後に。
新しい`.ipynb`を開く度、そのままでは権限が付与されておらず、編集ができない状態になっています。おそらく「A notebook could execute harmful code when opened.」というポップアップが表示されるので、「Trust」を選択してください。

（ちょっとここが面倒です。`ALL Trust`を選択しても、一度コンテナを再起動すると設定が初期化されます、、解決策ありましたらご教授ください:qiitan-cry:）

## 環境構築完了！
これで`Docker` + `VSCode` + `Remote Container`で、**入力補完などの強力な各ツールを効かせつつ、データ分析ができる環境が用意できました！**

なお、ワークスペースを閉じてもコンテナは起動しっぱなしなので、コンテナは都度停止するのを忘れないようにしてくださいね。
# 終わりに
Docker + VSCode + Remote Containerで、Jupyter Lab(Python)分析環境を作成しました。
入力補完も効きますし、自分的には快適だなぁと思っているのですが、Pythonでの分析をし始めたばかりなのでこれが正解かわかっておりません。

Google Colaboratory やAzure Notebookなどの便利なクラウドサービスもありますが、時間制限があったり、ローカルで分析した方が計算が早かった、という場合があったので、今回はローカルの環境構築方法にフォーカスしました。

内容の間違いや、もっと良い方法がありましたら、**ご指摘・ご教授をお願いいたします。**

では、快適なコーディング環境を！
# 参考資料
- [【Docker】3分でjupyterLab(python)環境を作る！](https://qiita.com/hgaiji/items/edf71435d0565257f980)

- [VSCode Remote Containerが良い](https://qiita.com/d0ne1s/items/d2649801c6f804019db7)

- [サーバーのDockerで起動したJupyter Notebookを他のパソコンからアクセスできるようにした話](https://qiita.com/yamasakih/items/d23ac0bf773e9b1b4d9d)