Docker 環境があると、ちょっとPythDon の勉強用の試しコード作成等や本来ならば個人のPCでやるべきようなことを仕事用などのPCを使う場合等、PCを汚したくない時にDocker環境の中にJupyter Notebook稼働環境を作ってPC環境から独立して使うことができます。
この記事で扱うPC環境は以下のとおりです。
| 仕様 | 内容 | 
|---|---|
| PCの仕様 | Windows 10 Pro バージョン21H1 16GB RAM | 
| Docker | Docker Desktop for Windows (version 20.10.8, build 3967b7d) | 
| その他 | VS Code 1.62.2 | 
Docker Dockerfile の中身は以下のとおりです。ファイルの設置先は、Jupyter Notebook のドキュメントルートとなるWORKDIR に設置します。

チートシート
| コマンド | 用途 | 
|---|---|
| FROM | ベースとなるイメージを指定します。 この例ではpython3.8-slim バージョンとしています。 | 
| WORKDIR | RUN, CMD等実行するコンテナプロセスのワークディレクトリを指定します。この例では、/docker_jupyter としています。 | 
| RUN | docker build 時に実行するコマンド この例ではnumpy, pandas, jupyter notebook をインストールを指定しています | 
| EXPOSE | Listen するポート番号を指定する環境変数です。 この例ではjupyter notebook の一般的な8888 を指定しています | 
| CMD | docker run 時に実行するコマンド この例ではjupyter notebookの起動オプションとしてjupyter notebook –no-browser –port=8888 –ip=0.0.0.0 –allow-root としています。 | 
| ノートブック起動オプション | –no-browser 起動後にブラウザでノートブックを開かない。ログとして吐き出されるトークン付きURLをブラウザに直接貼り付けて開く必要があります。 –allow-root ノートブックをrootユーザーから実行できるようにします。 –ip= ノートブックサーバが待ち受ける IP アドレス。 Default: 'localhost‘ 0.0.0.0 とするとすべてのインターフェースで待ち受けることとなります。 --port= ノートブックがリスンするポート番号(env: JUPYTER_PORT). Default: 8888  | 
    
DockerイメージをDockerFileからビルドする
Dockerfile で指定したWORKDIRと同じディレクトリを作成します。このディレクトリの直下にDockerfile を設置します。
コマンドプロンプトよりdocker build -t dev_jupyter . と入力します。dev_jupyterという名前のDockerイメージが作られます。後述するcompose.ymlでもコンテナが無い場合は、Dockerイメージは作成されますが、Dockerfileで記述した内容どおりイメージファイルが作成されることを確認したいので、まずは以下のとおりDockerfille を起動します。
PS C:\Users\xxxx\docker_jupyter> docker build -t dev_jupyter . 
[+] Building 62.5s (10/10) FINISHED
    省略
 => => naming to docker.io/library/dev_jupyter 入力した内容とその詳細は下図を参照してください。

docker imagesとコマンド入力し、作成されたDocker イメージを確認します。添付のスクリーンショットのとおり作成されました。赤枠が今回作成したDockerイメージに相当します。

コンテナを作成する
イメージを作成しただけではノートブックは使えません。ノートブックを使えるようにするため、コンテナを作成します。コマンドプロンプトからRUNコマンドで作成する方法とdocker-composeを使う方法を紹介します。
- コンテナが消滅してもプログラムなどのユーザデータはWindows PC上に保存できるようでJupyter NotebookのファイルをコンテナとPC間で共有できる
 - Windows標準のコマンドプロンプト-【方法1】
 - GitBashとdocker-composeを使う方法-【方法2】
 
Windows標準のコマンドプロンプトの方法
コマンドプロンプトからRUNコマンドを入力して、コンテナをすぐ使える起動状態で作成します。Windows版のDocker を使っています。 共有できるようにするため、volumeを定義します。
C:\Users\xxxx\docker_jupyterをコンテナとPCの共有ディレクトリとし、Pythonコード等をPCからエキスプローラで直接共有できるようにします。コマンドの詳細は下図のとおりです。 Windows標準のコマンドプロンプトからコマンド投入することを前提にしたコマンドフォーマットを紹介します。

Windows標準のコマンドプロンプトからコマンド投入することを前提にしたコマンドフォーマットを紹介します。
docker container run -p 8888:8888  -v “%cd%”:/docker_jupyter  dev_jupyter
以下が実際のコマンド投入後のログになります。
C:\Users\xxxx\docker_jupyter>docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
dev_jupyter   latest    xxx93b79b3   20 hours ago   395MB
C:\Users\xxxx\docker_jupyter>docker container run -p 8888:8888  -v "%cd%":/docker_jupyter  dev_jupyter
   
  << 省略>>
    
    To access the notebook, open this file in a browser:起動オプションで指定したとおり、ノートブックはブラウザから自動的に起動しません。copy and paste one of these URLs:とあるURLをブラウザのURL指定部分にコピペすると、下図のとおりノートブックがコンテナを起動した際のカレントディレクトリを共有ディレクトリ(コンテナの外のDirectory)上に起動します。これらのファイルはDocker コンテナーからアクセスしJupyter Notebook が起動するだけでなく、PCからもエキスプローラでアクセスできるようになります。

docker-compose を使う方法
docker-compose.ymlというcompose ファイルをDockefile と同じディレクトリに配下に設置します。

docker-compose.ymlの中身は以下のとおりです。ここでは、volume の記述${PWD}が とlinux 用のbashで記述していますので、Windows コマンドプロンプトではなく、Git Bash からdocker-compose upコマンドを打つ必要があります。

コンテナが無い場合は、Dockerfile を参照してキャッシュからイメージを再作成した上でコンテナを作成します。
$ docker-compose up
  [+] Building 7.4s (8/8) FINISHED
   => [internal] load build definition from Dockerfile 
 << 省略>>