WSL2上のDockerでJupyter環境の構築(Docker Compseで起動楽々)

# この記事で伝えたいこと
この記事で以下の困りごとにこたえていきたいと思います！

:::note
**Dockerをインストールしたけど、具体的な開発環境の構築方法がわからない**
:::

Dockerをまだインストールしていない方は、以前にDockerのインストール方法について説明した記事があるのでそちらを参考にしてください。

https://qiita.com/hiroakikka/items/b7a63383fb8cb989e722

# Dockerを用いたJupyter環境構築
ざっくりとした流れは以下の通りです。
**1.** **[(必要に応じて)docker-composeをインストールする](#1必要に応じてdocker-composeをインストールする)**
**2.** **[作業フォルダ・ファイルの作成](#2作業フォルダファイルの作成)**
**3.** **[必要なPythonライブラリをrequrement.txtにまとめる](#3必要なpythonライブラリをrequirementstxtにまとめる)**
**4.** **[Dockerfileを編集する](#4dockerfileを編集する)**
**5.** **[docker-compose.ymlを編集する](#5docker-composeymlを編集する)**
**6.** **[docker-compose.ymlファイルを実行する](#6docker-composeymlファイルを実行する)**

この手順にしたがってインストールしていきます。

### 1.(必要に応じて)docker-composeをインストールする
そもそもDocker Composeを使う主な利点は、複数のコンテナをまとめて定義・管理・起動するためです。今回の場合、1つのコンテナしか利用しないので、必要性は小さいと感じますが、複数の設定（ポート、ボリューム、コマンドなど）を1つのYAMLファイル（docker-compose.yml）で定義し、一括で起動・管理できる点もメリットの一つだと思います。そのため、今回は、Docker Composeを用いて、Jpyter環境を簡単に構築していきます。
まず、Docker Composeを用いるために、linux上にdocker composeをインストールするします。なので、私の場合、「Ubuntu24.04」のターミナルを開いて以下のコマンドを実行します。
`sudo apt-get install docker-compose-plugin`
すると以下のような画面が出てくると思います。
```bash
hiro@MAIN:$ sudo apt-get install docker-compose-plugin
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  docker-compose-plugin
0 upgraded, 1 newly installed, 0 to remove and 39 not upgraded.
Need to get 0 B/12.8 MB of archives.
After this operation, 64.3 MB of additional disk space will be used.
Selecting previously unselected package docker-compose-plugin.
```
docker composeがインストールされているか確認のため、以下のコマンドを打ち込みます。
`docker compose version`
以下のような表示がされれば、インストールが完了しています。
```
hiro@MAIN:$ docker compose version
Docker Compose version v2.31.0
```
### 2.作業フォルダ・ファイルの作成
ファイルの構成について説明すると、まず、どこかの適当な場所にプロジェクト用のフォルダを作成してください。
そのフォルダ内に「テキストドキュメント」で新しいファイルを作成し、`Dockerfile`,`docker-compose.yml`,`requirements.txt`を作成します。
`Dockerfile`は拡張子なしで大丈夫です。
`git`の中で作業する感じで考えています。
それぞれのファイルの意味や中身については後で説明します。

```
project/
│─ git
├─ Dockerfile
│─ docker-compose.yml
│─ requirements.txt
├─ .gitignore             → Gitで追跡しないファイルの指定（今回は必要ないので省略）
└─ README.md              → プロジェクト概要や手順説明（今回は必要ないので省略）
```
こんな感じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760884/dc2149a7-e143-7688-eec9-c2b5c857eb67.png)


### 3.必要なPythonライブラリをrequirements.txtにまとめる
このプロジェクトで必要となるPythonライブラリをrequirements.txtにまとめます。
今回は適当に以下のようなライブラリをインストールするものを考えてみました。
ご自身のプロジェクトに必要なライブラリ名・バージョンへ変更してください。
```requirements.txt
numpy==2.2.1
pandas==2.2.3
matplotlib==3.10.0
seaborn==0.13.2
jupyter==1.1.1
```
上の内容をrequirements.txtに書き込みます。
（requirements.txtのもう少し知りたい方は以下の記事を参考にしてください。）

https://qiita.com/NUNOGAWA/items/2711f5b731f461295388

### 4.Dockerfileを編集する
`Dockerfile`を一言で表すと、「Docker イメージを作成（ビルド）するためのレシピ（設計図）となるファイル」です。
もう少し詳しく知りたいよって方は以下の記事で詳しく説明してあるのでそちらを参照してください。

https://qiita.com/gon0821/items/f9e3bcbb6cb01d4ef7fa

今回は、Python（3.13）をベースとして、`requirements.txt`に記載されているライブラリをインストールし、`jupyter lab`を立ち上げるDockerfileを作成しました。
別のPythonバージョンに変更したい場合は、基本的には`python:<version>`に従って、`version`の部分を変更してください。もう少しこだわりたい方は、以下のリンクを参照に適宜変更してください。

https://hub.docker.com/_/python

```dockerfile:Dockerfile
FROM python:3.13

# pip のアップグレード
RUN pip install --upgrade pip

# 依存関係をインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# ホストからアクセスできるようにポート8888を開放
EXPOSE 8888

# コンテナ起動時にJupyterLabを起動
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root"]
```
上のようにDockerfileを編集します。
以下にそれぞれのコマンドのざっくりとした意味を捕捉します。
`FROM python:3.13`
Python 3.13 をベースにしたイメージを使用し、コンテナ環境を構築。
`RUN pip install --upgrade pip`
pip を最新バージョンへ更新し、パッケージインストール時の不具合を予防。
`COPY requirements.txt .`
Python の依存関係リストをコンテナにコピー。
`RUN pip install --no-cache-dir -r requirements.txt`
依存関係をまとめてインストールし、キャッシュを残さない設定でイメージサイズを抑える。
`EXPOSE 8888`
コンテナ内で使用するポート8888のメタ情報。ホストと接続するには -p オプション等が必要。
`CMD ["jupyter", "lab", ...]`
コンテナ起動時に JupyterLab を立ち上げるコマンド。外部からのアクセスを許可するために IP, ポート、その他のオプションを設定。


### 5.docker-compose.ymlを編集する
`docker-compose.yml`を一言で表すと、「コンテナの設定を整理し、1つでも複数でも簡単に起動や管理、共有ができるファイル」です。
もう少し詳しく知りたいよって方は以下の記事で詳しく説明してあるのでそちらを参照してください。

https://qiita.com/gon0821/items/77369def082745d19c38

今回は、docker-compose.ymlファイルを用いることで、ホストのポート`8888`を コンテナのポート`8888`に割り当てています。また、ホスト側の `./git` ディレクトリ を コンテナ内の `/workspace` ディレクトリ にマウントしています。


```yaml:docker-compose.yml
services:
  jupyterlab:
    build: .
    image: jupyterlab
    ports:
      - "8888:8888"
    volumes:
      - ./git:/workspace
    command: jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.notebook_dir=/workspace
```
上の内容に、docker-compose.ymlファイルを編集します。

### 6.docker-compose.ymlファイルを実行する

「Ubuntu24.04」を立ち上げると以下のような画面だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760884/f1ac4470-c34d-05e8-9df6-1dc08edad88d.png)
ここから、docker-compose.ymlファイルがある`project`のフォルダに移動します。
今回はホストPCのNドライブに格納したので、`cd /mnt/n`をコマンドとして打ち込みます。
`mnt`を使用することで、ローカルフォルダにアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760884/5c8c592f-0b1c-125c-8592-dbb7b9be44df.png)
移動できました。
確認のため、フォルダ内に何が入っているのか、`dir`コマンドで確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760884/996e33de-8b2f-8b19-49d7-34c0fc5bca40.png)
先ほど作成した`project`フォルダがありますね。
`cd project`でフォルダ内に移動します。
`dir`コマンドでフォルダの中身を確認し、先ほど作ったファイルがあることを確認します。
ここのディレクトリで`docker compose up`を打ち込みます。
そうすると、以下のような画面となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760884/ee6c2c56-969d-d6f7-172a-07855e564761.png)
後ろのほうを見ると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760884/2b559110-6183-5e93-3db4-49d517230d89.png)

2つあるうちのどちらでもいいのですが、`http:~`のリンクにWebブラウザを用いて、アクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760884/2563e6a2-5306-8546-7610-7af44b476362.png)

これでJupyter環境の構築は終了です。
先ほどの`git`のフォルダ内を見ている状態なので、作成したフォルダ・ファイルは、先ほどの`git`内に保存されていきます。
最後に作業が終了した後は、まずは、ブラウザ上でjupterをシャットダウンさせます。
その後、`docker compose down`でコンテナを閉じるようにしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760884/b0ac931e-08f0-ba5b-3fe7-675f1836e69e.png)

何か不明点あれば、コメント欄に記載いただければと思います。

## 参考文献

https://qiita.com/hiroakikka/items/b7a63383fb8cb989e722

https://qiita.com/NUNOGAWA/items/2711f5b731f461295388

https://hub.docker.com/_/python

https://qiita.com/gon0821/items/77369def082745d19c38

https://jupyterlab.readthedocs.io/en/stable/user/index.html