手間がかからないPython環境構築方法について書く

## 概要
この記事ではDocker-composeを使って、独立なpython環境を簡単に立ち上げ、ブラウザから接続する方法について書いていきたいと思います。また、ブラウザからのアクセスと同じように、VSCodeからもインタラクティブにコードを実行する方法についても書いていきます！これは「まっさらな実行環境で動かしてみたい」というような要望に答えられると思います！

## 前提
この記事ではDocker, Docker-composeおよびVSCodeの導入は書きません。調べれば簡単に出てくると思います(WindowsのDockerは大変そうですが、、)。また、僕はデータサイエンスを専門としているのでプログラミング言語はPython3です。詳しく書きませんがRも一部対応しています。Apple信者なのでOSはMacを使いますが、おそらくDockerさえ使えればどの環境でも動くのではないかと思います。

## 手順
今回の記事では以下の手順を踏みます。

1. Dockerfileのダウンロード
2. docker-compose.ymlを作成
3. docker-composeからコンテナを起動してブラウザからアクセス
4. (おまけ) VSCodeのRemote DesktopとjupyterのExtensionを使った快適なコーディング


## 1. Dockerfileのダウンロード
jupyter公式githubの[docker-stacsレポジトリ](https://github.com/jupyter/docker-stacks)にはJupyterを用いたpython環境を構築するツールがたくさん並んでいます。例えば、tensorflowでDeepLearningをしたくなったら、[tensorflow-notebook](https://github.com/jupyter/docker-stacks/blob/master/tensorflow-notebook/Dockerfile)というところに行けば、下のようにDockerfileがあることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265221/0f4dfcf9-545c-d9d7-e152-c8fd2aba55b6.png)


このDockerfileの中に、

```
ARG BASE_CONTAINER=jupyter/scipy-notebook
```
という部分がありますが、これは[scipy-notebook](https://github.com/jupyter/docker-stacks/blob/master/scipy-notebook/Dockerfile)をベースとして追加的に操作をしているという意味になります。そして[scipy-notebook](https://github.com/jupyter/docker-stacks/blob/master/scipy-notebook/Dockerfile)の方をのぞきますと、同じく

```
ARG BASE_CONTAINER=jupyter/minimal-notebook
```
と書いてあるんですね。これはtensorflow用の環境はScipy用(基本的なpythonによるデータサイエンス用)の環境にtensorflowを追加してあり、Scipy用の環境はminimalな環境にscikit-learnやpandasなどが追加された環境であることを意味しています。
詳しくは追いませんが、他にもspark環境やR環境などがあり、必要に応じたDockerfileを使えば、それに応じた環境が一発で立ち上がるということです！また、Dockerなので、個人的に加えたいライブラリなどがあれば少し書き加えるだけで良いのでとても便利です！

ということなので、まずは動かしたいディレクトリをターミナルから開いて、このリポジトリをクローンします。

```
$ git clone https://github.com/jupyter/docker-stacks.git
```
そして、例えばbase-notebookを使いたいときは、

```
$ cp -R ./docker-stacks/base-notebook ./
```
などとして、ツールをコピーすればダウンロード完了です。

## 2. docker-compose.ymlを作成
毎回jupyterを立ち上げたり、ポートを指定しているコマンドを書くのは面倒なのでdocker-composeを使って簡単に立ち上げていきます。

```docker-compose.yml
version: '3'
services:
  # jupyterlabというサービス名(コンテナ名)に設定
  jupyterlab:
    # Dockerfileからbuild(追加的な設定を書き込めるように)
    build:
      context: .
      dockerfile: Dockerfile

    # ホストの./workをコンテナの/home/jovyanにマウント
    # Jovian means "related to Jupiter"
    volumes:
       - "./work:/home/jovyan"
      
    # ユーザーを設定
    user: root
    environment:
      B_UID: 1000
      NB_GID: 100
      GRANT_SUDO: "yes"

    # デバイスへのアクセスを許可
    privileged: true

    # ホストの8888とコンテナの8888をマッピング
    ports:
      - "8888:8888"

    # stopされない限り再起動をする
    restart: unless-stopped

    #　コンテナ起動後にjupyterlabを起動
    command: start.sh jupyter lab --NotebookApp.token=''
```
上のようなファイルをDockerfileと同階層(僕はbase-notebookディレクトリ直下）に作ればOKです。ただし、8888番ポートがホストで使用中の場合は異なる番号にXXXX:8888をよしなに設定すると良いでしょう。

## 3. docker-composeからコンテナを起動してブラウザからアクセス
以上ができたらあとはターミナルで、docker-compose.ymlと同階層にいき、

```
$ docker-compose up -d
```
と打つだけです。そして、立ち上がったら、ブラウザにlocalhost:8888を打ち込めば、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265221/f45f76e0-4847-8d03-4309-ddb2a79e5cd6.png)
このようにjupyterlabが開かれます。すごい簡単ですね。
volumeを ./work /home/jovyan　としたので、jupyterlabのホームからファイルを作成すると、ホスト側の./workに反映されます。これにてpythonの環境構築ができました。あとは書きたい記事に合わせて必要なパッケージをインストールすれば良いですし、そのDockerfileを共有すれば再現性が得られます！

## 4. (おまけ) VSCodeのRemote DesktopとjupyterのExtensionを使った快適なコーディング
ここまででも十分なのですが、今回はおまけとしてVSCodeでインタラクティブな実行環境を作ることにチャレンジしていきます。
これを行うメリットとしては、やはりpyファイルのまま部分的な実行ができるというところです。リファクタリングなど、ipynbファイルだけは難しい処理を簡単にデバッグしながら書けるのはとても便利だと思います。

では、早速作業に入っていきます。
DockerとRemote DesktopのExtensionがインストール済のVSCodeなら、Command + Shift + Pを押すと、下のようにコマンド操作のタブが開くので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265221/db960ce9-3822-e43f-4b6b-b8364a45dc2f.png)
Open Folder in Containerを使って、先ほどセットしたツールを開きます。(僕の場合は、base-notebookを開きます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265221/153f936e-d3b1-7a2c-5f55-4b7f9f1e973c.png)

ここで、Configを聞かれたらFrom docker-composeを選びましょう。
そうしてしばらく待って、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265221/179b207f-9c25-7ab7-0bfd-2e59b2becf9c.png)
このような画面が開かれればひとまずコンテナへのアクセスは成功です。

jupyterはというと、Extensionの検索からjupyterと打って、一番上に表示されるこちらをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265221/72f788dc-d475-414b-e457-6e713f97d392.png)

インストールが終わると下のように「再読み込みが必要です」というボタンが出るので、そこを押してリロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265221/f53b7542-b2e9-997b-7866-ccad8b1dad81.png)

リロードされたら、./workのなかに適当にjupyter_test.pyとでも決めてpythonファイルを作ってみましょう。そして以下のように、「# %%」と入力すると、その上に「Run Cell」などのコマンドが表示されます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265221/a5b524e7-44de-0726-969a-042b3ade0252.png)
このRun Cellを押すと、次の「# %%」までのブロックに書いてあるコードがインタラクティブに実行されます。これが確認できたら、成功です！

## まとめ
今回は、クリーンかつ再現性のあるpythonの実行環境を簡単に立ち上げる方法を紹介し、VSCodeでインタラクティブに実行するところまで紹介しました。OSやデバイスに依存しないpython環境をコマンド一発で用意できるのは便利ですよね。やっぱりDockerはすごいなと再認識しました(語彙力)。今後はこの環境を使ってソースコードの公開やライブラリ作成にチャレンジできればと思います。最後までご覧いただきありがとうございました！！