授業やSIGNATEのコンペでPythonを使うので、環境構築でDockerを使ってみようという試みです。
ここ半年間はPyCharmをローカル環境で利用しましたが、動作が少し重いと感じていました。また、機械学習する際に実機のリソースをあまり消費したくありませんでした。そこで、より軽量で、カスタムしやすい環境を目指しました。
さらに、補完能力や機動性が高く、拡張機能の多いVScodeをリモートの接続先でも利用できるようにし、コーディングできるようにしました。
内容としてはn番煎じかもしれませんが、どこかで役に立てたら嬉しいです。
【追記】
2023/9/28
「【Python】Qiita 週間いいね数ランキング」にランクインしました!ありがとうございます。
参考用レポジトリ
目標
ローカル環境を汚さずに、コンテナ上で環境構築を完結させる。
VScodeとコンテナをリモート接続し、コンテナ上でVScodeを利用する。
動作環境
-
- OS:Windows11
-
- Docker Desktop:4.23.0
-
- Docker:24.0.6
- VScode:1.82.2
下準備
以下の順番に従って下準備を進めていきます。
-
- Docker Desktopのインストール
-
- Anaconda環境のイメージをダウンロードする
- Jupyterが直接アクセスするディレクトリ(またプロジェクトファイル)を作成
※VScodeは既にインストールしているものとします。
1.Docker Desktopのインストール

2.Anaconda環境のイメージをダウンロード(pull)する


3.Jupyterが直接アクセスするディレクトリ(またプロジェクトファイル)を作成
ローカルにあるどのファイルをJupyterで開くかを決める。また、Jupyter Notebook サーバーがホストするノートブックのディレクトリまたはパスを指定する。言い換えれば、Jupyter Notebook サーバーが起動する際の作業ディレクトリを指定する。このディレクトリには、ユーザーがアクセスしたり、作成したりできるノートブックが含まれる。
-
- マウント
-
- ファイルシステムの一部をオペレーティングシステムに接続するプロセスを指す。これによって、ユーザーやアプリケーションは、そのファイルシステムのコンテンツにアクセスできるようになる。コンテナ技術では、ホストシステムのディレクトリやファイルをコンテナ内にマウントすることができる。これにより、コンテナ内のアプリケーションがホストのファイルやディレクトリにアクセスできるようになる。
- 平たく言うと、コンテナ技術においてはコンテナ内のアプリケーションとホストマシンのファイルシステム間で、データの共有や交換を可能にするということである。

コンテナ内のJupyter用のディレクトリは後ほどコマンドでまとめて指定する。
手順
以下の手順に従ってPythonとJupyterの仮想環境を構築する。
-
- コンテナとJupyterを起動する
-
- アクセスを確認する
- 下準備さえ終われば、後はコマンドを実行してコンテナを立ち上げるのみである。
1.コンテナとJupyterを起動する
まず、プロジェクトファイルのあるディレクトリに移動する。今回は、先ほど作成したファイルをプロジェクトファイルとする。
C:\hoge\huga>cd PyLearning
移動したらカレントディレクトリが以下のようになる。
C:\hoge\huga\PyLearning>
そのまま以下のコマンドを実行する。
docker run -v "%cd%":/notebook02 ^
-p 8889:8888 --rm -it continuumio/anaconda3:latest ^
jupyter notebook --ip 0.0.0.0 --allow-root --no-browser ^
--NotebookApp.disable_check_xsrf=True --NotebookApp.token='' ^
--NotebookApp.password='' /notebook02


コマンドがいきなり出てきて困惑していると思うので各オプションと意味を説明する。
コマンドの意味
docker run
このコマンドは、新しいDockerコンテナを起動する。
-v “%cd%”:/notebook02
このオプションは、ホストマシンのカレントディレクトリ(%cd%はWindowsのカレントディレクトリを示す)を、コンテナ内の/notebook02ディレクトリにマウントする。これにより、コンテナ内のアプリケーションは、ホストマシンのカレントディレクトリにアクセスできるようになる。
-p 8889:8888
このオプションは、ホストマシンの8889ポートを、コンテナ内の8888ポートにマッピングする。これにより、ユーザーはホストマシン上でhttp://localhost:8889にアクセスすることで、コンテナ内で実行されているJupyter Notebookにアクセスできる。
–rm
このオプションは、コンテナが終了した時に自動的にコンテナを削除する。
-it
このオプションは、コンテナをインタラクティブモードで起動し、ターミナルをアタッチする。
continuumio/anaconda3:latest
これは、使用するDockerイメージを指定する。ここでは、continuumio/anaconda3のlatestタグのイメージが使用される。これにはAnaconda3がプリインストールされている。
jupyter notebook –ip 0.0.0.0 –allow-root –no-browser
これは、コンテナ内で実行されるコマンドを指定する。ここでは、Jupyter Notebookが0.0.0.0のIPアドレスで、root権限で、ブラウザなしで起動される。
–NotebookApp.disable_check_xsrf=True –NotebookApp.token=” –NotebookApp.password=”
これらのオプションは、Jupyter Notebookのセキュリティ設定を調整する。XSRFチェックを無効にし、トークンとパスワードを空に設定する。これにより、認証なしでJupyter Notebookにアクセスできる。
/notebook02
最後に、Jupyter Notebookがホストするノートブックのディレクトリとして/notebook02を指定する。これは前述の-v “%cd%”:/notebook02オプションでホストマシンのカレントディレクトリにマッピングされている。
2.アクセスを確認する

VScodeと接続
環境構築が完了したら、さっそくコーディング…!と行きたいところであるが、どうやってファイルを操作したりコーディングするの?となると思います。
そこで、今回はVScodeの拡張機能を利用したリモート接続によって、コンテナと接続して直接コーディングやデバッグを行えるようにしていきます。
Dev Containersのインストール

リモート接続

pip install opencv-python-headless

おわりに
Dockerは1つのイメージをインストールすれば、いくつでもコンテナを起動することができる優れものです。OSに影響を受けない点も強みであると言えます。
また、軽量であることも相まって、とても重宝しそうです^^
最初にコンテナ化の概念を理解する部分は少し難しいですが、どういう仕組みで何が行われているかがわかれば、わりと合理的な手法であることがわかってきます。
とはいえ、私自身も完全に理解しているわけではないので、様々なことに挑戦しながら理解できたことを共有していけたらと思っています。