この記事はどのような内容?
Docker + VSCode + Remote Containerで作るデータ分析環境構築の手順が書いてあります。
想定読者
「Jupyter Lab? それともGoogle Colaboratoryなどのクラウドサービス?…なんか色々あって、Pythonのデータ分析環境わからん!簡単に導入できて、かつそれなりに快適な分析環境を整えたい!」
という方に向けて書きました。
サンプルリポジトリはGitHubにPushしていますので、cloneしてコンテナを立ち上げ、READMEの手順に沿ってリモート接続していただければ、10分程度で環境構築ができます。
この記事を読んだ方のデータ分析環境の選択に、少しでも貢献できましたら幸いです。
はじめに
最近、Python でデータ分析する機会があり、Jupyterが動く環境を構築する必要がありました。
ローカルにJupyter Lab環境を直接構築しても良いのですが、なるべくローカル環境は汚したくないですし、Jupyter LabではVSCodeと違って入力補完等のサポートが弱いので、ちょっと使いにくい。
色々と調べていると、VSCodeのOctober-2019-releaseで、Microsoft公式の Python 拡張機能が、.ipynb(Ipython notebook専用ファイル)をサポートしていたことを知りました。よって、コーディング環境はJupyter Labではなくインテリセンスなどが効くVSCodeを選択。
仮想環境も、Jupyter LabのDockerイメージがDocker Hubにpushされていることを知ったので、pullしてこれば手軽に環境構築ができそうです。
ということで、
仮想環境は、Jupyter LabのDockerイメージを使う
Remote Containerを使って、起動したコンテナにリモート接続
Remote Containerで接続したワークスペース内で、入力補完やLinterを効かせながらコーディング

Docker + VSCode + Remote Containerで作るJupyter Lab(Python)分析環境構築
以下の内容は、自分で環境構築をされる方用に、少し細かく説明したものになります。
この記事の上部に載せたリポジトリには、必要拡張機能や各種設定を.vscode/settings.json・.devcontainer/devcontainer.jsonに記述 & 最低限の手順をREADMEに記載しておりますので、以下手順を読む必要がないようにしてあります。
動作環境
Docker
他の方が書かれた記事:【Docker】3分でjupyterLab(python)環境を作る!を参考に…というか丸パクリなのですが、docker-compose.ymlに、Jupyter Lab環境構築に必要な設定を記述します。
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を他のパソコンからアクセスできるようにした話
Who is jovyan? #358
これで、Jupyter Labが動く環境が用意できました。
Remote Container
このままdocker-compose up -dでコンテナを立ち上げれば、http://localhost:8888 にアクセスしてJupyter Labでコーディングできます。
別にそれでも良いのですが、VSCodeの入力補完などの強力な拡張機能の恩恵を受けたいため、Remote Containerで立ち上げたコンテナにリモート接続し、VSCodeでコーディングしたいと思います。
Remote Containerに関しては、調べると他の方が詳しく説明をしてくださっていますので、そちらをご参照ください。
参考:VSCode Remote Containerが良い
Remote Containerの設定
VSCode [設定]→[拡張機能]→[Remote Container]:インストール。
インストールすると、「Reopen in Container」というポップアップが表示されるので、選択。

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

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

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

他にも、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を選択しても、一度コンテナを再起動すると設定が初期化されます、、解決策ありましたらご教授ください)
環境構築完了!
これでDocker + VSCode + Remote Containerで、入力補完などの強力な各ツールを効かせつつ、データ分析ができる環境が用意できました!
なお、ワークスペースを閉じてもコンテナは起動しっぱなしなので、コンテナは都度停止するのを忘れないようにしてくださいね。
終わりに
Docker + VSCode + Remote Containerで、Jupyter Lab(Python)分析環境を作成しました。
入力補完も効きますし、自分的には快適だなぁと思っているのですが、Pythonでの分析をし始めたばかりなのでこれが正解かわかっておりません。
Google Colaboratory やAzure Notebookなどの便利なクラウドサービスもありますが、時間制限があったり、ローカルで分析した方が計算が早かった、という場合があったので、今回はローカルの環境構築方法にフォーカスしました。
内容の間違いや、もっと良い方法がありましたら、ご指摘・ご教授をお願いいたします。
では、快適なコーディング環境を!
参考資料
【Docker】3分でjupyterLab(python)環境を作る!
VSCode Remote Containerが良い
サーバーのDockerで起動したJupyter Notebookを他のパソコンからアクセスできるようにした話