LoginSignup
2
5

Dockerコンテナを利用したPython,Jupyterの環境構築とVScodeとのリモート接続

Last updated at Posted at 2023-09-24

授業や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

下準備

以下の順番に従って下準備を進めていきます。

  1. Docker Desktopのインストール
  2. Anaconda環境のイメージをダウンロードする
  3. Jupyterが直接アクセスするディレクトリ(またプロジェクトファイル)を作成

※VScodeは既にインストールしているものとします。

1.Docker Desktopのインストール

Docker Desktopのページからインストールする。
image.png
Download for (該当OS)のボタンからインストーラーのダウンロードを開始し、インストーラーを開き、案内に従ってインストールを進めます。
私の環境では、なにか特別に設定をカスタムすることはありませんでした。

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

今回はAnaconda公式のDockerイメージをダウンロードする。
continuumio/anaconda3 - Docker Hub
ダウンロードするときは以下のコマンドで行うことができる。
docker pull continuumio/anaconda3
もちろんPullボタンからダウンロードすることもできる。(おそらく最新版をダウンロードする)
image.png

ダウンロードするとImagesに追加される。
image.png

3.Jupyterが直接アクセスするディレクトリ(またプロジェクトファイル)を作成

ローカルにあるどのファイルをJupyterで開くかを決める。また、Jupyter Notebook サーバーがホストするノートブックのディレクトリまたはパスを指定する。言い換えれば、Jupyter Notebook サーバーが起動する際の作業ディレクトリを指定する。このディレクトリには、ユーザーがアクセスしたり、作成したりできるノートブックが含まれる。

  • マウント
    ファイルシステムの一部をオペレーティングシステムに接続するプロセスを指す。これによって、ユーザーやアプリケーションは、そのファイルシステムのコンテンツにアクセスできるようになる。コンテナ技術では、ホストシステムのディレクトリやファイルをコンテナ内にマウントすることができる。これにより、コンテナ内のアプリケーションがホストのファイルやディレクトリにアクセスできるようになる。
    平たく言うと、コンテナ技術においてはコンテナ内のアプリケーションとホストマシンのファイルシステム間で、データの共有や交換を可能にするということである。

今回は、ホストマシン上のC:\hoge\huga\PyLearningにJupyterをアクセスさせることにした。ホストマシン上にディレクトリを作成する。
image.png

コンテナ内のJupyter用のディレクトリは後ほどコマンドでまとめて指定する。

手順

以下の手順に従ってPythonとJupyterの仮想環境を構築する。

  1. コンテナとJupyterを起動する
  2. アクセスを確認する
    下準備さえ終われば、後はコマンドを実行してコンテナを立ち上げるのみである。

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

コンテナが立ち上がり、Jupyterが起動する。
image.png

コンテナが立ち上がっていることはDocker Desktopからも確認することができる。
image.png

コマンドがいきなり出てきて困惑していると思うので各オプションと意味を説明する。

コマンドの意味

  1. docker run
    このコマンドは、新しいDockerコンテナを起動する。

  2. -v "%cd%":/notebook02
    このオプションは、ホストマシンのカレントディレクトリ(%cd%はWindowsのカレントディレクトリを示す)を、コンテナ内の/notebook02ディレクトリにマウントする。これにより、コンテナ内のアプリケーションは、ホストマシンのカレントディレクトリにアクセスできるようになる。

  3. -p 8889:8888
    このオプションは、ホストマシンの8889ポートを、コンテナ内の8888ポートにマッピングする。これにより、ユーザーはホストマシン上でhttp://localhost:8889にアクセスすることで、コンテナ内で実行されているJupyter Notebookにアクセスできる。

  4. --rm
    このオプションは、コンテナが終了した時に自動的にコンテナを削除する。

  5. -it
    このオプションは、コンテナをインタラクティブモードで起動し、ターミナルをアタッチする。

  6. continuumio/anaconda3:latest
    これは、使用するDockerイメージを指定する。ここでは、continuumio/anaconda3のlatestタグのイメージが使用される。これにはAnaconda3がプリインストールされている。

  7. jupyter notebook --ip 0.0.0.0 --allow-root --no-browser
    これは、コンテナ内で実行されるコマンドを指定する。ここでは、Jupyter Notebookが0.0.0.0のIPアドレスで、root権限で、ブラウザなしで起動される。

  8. --NotebookApp.disable_check_xsrf=True --NotebookApp.token='' --NotebookApp.password=''
    これらのオプションは、Jupyter Notebookのセキュリティ設定を調整する。XSRFチェックを無効にし、トークンとパスワードを空に設定する。これにより、認証なしでJupyter Notebookにアクセスできる。

  9. /notebook02
    最後に、Jupyter Notebookがホストするノートブックのディレクトリとして/notebook02を指定する。これは前述の-v "%cd%":/notebook02オプションでホストマシンのカレントディレクトリにマッピングされている。

2.アクセスを確認する

今回は8889番ポートを指定したので以下のリンクを開く。本来は8888番ポートを指定し、アクセスする。
http://localhost:8889/
以下のようなページが開かれたら成功している。
image.png

VScodeと接続

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

Dev Containersのインストール

まず、VScodeの拡張機能であるDev Containersをインストールする。拡張機能はエディタの左側の四角の集合体のアイコンからアクセスできる。
image.png

リモート接続

新しいウィンドウの状態で、左下の><のマークをクリックする。
image.png
するとメニューが出てくるので、Attach to Running Containerをクリック。
image.png
先ほどのコンテナの名前を参考にして、適切なものを選択する。
image.png
選択すると、><の部分が、コンテナとリモート接続できていることを表示する。それが確認出来たら、左上のハンバーガーメニューをクリックし、Open Folderを選択する。
image.png
すると、先ほど設定したJupyter用のディレクトリがあるので、それを開く。
image.png
これで、コンテナ内の作業ディレクトリに移動できたことになる。
以下の図では、右側がコンテナ内のエディタで、左側がローカル(ホストマシン上)のエディタとなっている。
image.png
試しに、K-meansを用いたクラスタの機械学習のPythonコードをコンテナ内で実行してみた。
image.png
デバッグも行うことができる。まずブレークポイントを設定する。
image.png
Xの中身を知りたいのでView Value in Data Viewerを用いて確認する。
image.png
すると以下のようにXの配列の中身を確認することができる。
image.png
必要なライブラリは、コンテナ内のターミナルでインストールすることができる。例えば、opencvをインストールして利用したいときは以下のコマンドを実行する。

pip install opencv-python-headless

これでインポートが可能になる。
さらに、.ipynb(Jupyterのファイル)もコンテナ内で実行することができる。(別途VScodeのJupyter用拡張機能のインストールが必要)
image.png

おわりに

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

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5