DockerとVSCodeを使ったJupyter Notebookによるデータ分析環境のセットアップ


## はじめに 

このガイドでは、DockerとVisual Studio Code (VSCode)を使用して、Jupyter Notebookでデータ分析を行うための環境をセットアップします。この方法は、再現性の高い開発環境を提供し、ホストシステムに影響を与えずにプロジェクトを管理できるという利点があります。

## 前提条件
- Docker Desktopがインストールされていること
- Visual Studio Code (VSCode)がインストールされていること
- VSCodeに「Remote - Containers」拡張機能がインストールされていること

## ステップ1: プロジェクトディレクトリの作成

1. ターミナルを開きます。
2. 以下のコマンドを実行して新しいディレクトリを作成し、そこに移動します：
   ```bash
   mkdir ml_project
   cd ml_project
   ```

## ステップ2: 必要なファイルの作成

以下の4つのファイルを作成します：

### 2.1 Dockerfile

```dockerfile
# Dockerfile
FROM python:3.9

# 作業ディレクトリの設定
WORKDIR /app

# 必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
    gcc \     # C言語のコンパイラ
    g++ \     # C++言語のコンパイラ
    git \     # バージョン管理システム
    vim \     # テキストエディタ
    && rm -rf /var/lib/apt/lists/*  # キャッシュクリアでイメージサイズを削減

# Pythonパッケージのインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
```

#### Dockerfileの詳細説明
このDockerfileは、Python 3.9の公式イメージをベースにしており、以下の環境を設定しています。

- **作業ディレクトリ** (`WORKDIR /app`): `/app`ディレクトリがコンテナ内の作業ディレクトリとして設定されます。すべてのコマンドはこのディレクトリ内で実行されます。
- **パッケージのインストール**: `apt-get`を使用して、開発に必要なC/C++コンパイラ（`gcc`, `g++`）、バージョン管理システム（`git`）、およびテキストエディタ（`vim`）をインストールします。`apt-get update`でパッケージリストを更新し、`apt-get install -y`で指定したツールをインストールします。最後に、`/var/lib/apt/lists/*`を削除することでイメージのサイズを最小限に抑えています。
- **Pythonパッケージのインストール**: `requirements.txt`をコンテナにコピーし、`pip install --no-cache-dir -r requirements.txt`でPythonライブラリをインストールします。このコマンドはキャッシュを使用せず、直接インストールを行います。

### 2.2 docker-compose.yml

```yaml
# docker-compose.yml
version: '3'
services:
  ml-environment:
    build: .
    volumes:
      - .:/app
    ports:
      - "8888:8888"
    command: jupyter lab --ip=0.0.0.0 --allow-root --no-browser
```

#### docker-compose.ymlの詳細説明
この`docker-compose.yml`ファイルは、以下のようにDockerコンテナを設定します：

- **バージョン** (`version: '3'`): 使用するDocker Composeのバージョンを指定しています。
- **サービス** (`services`): `ml-environment`という名前のサービスを定義します。
  - **build**: Dockerfileが存在するディレクトリを指定します（ここでは現在のディレクトリ `.`）。
  - **volumes**: ホストのプロジェクトディレクトリをコンテナ内の`/app`にマウントし、コンテナ内でのファイル編集がホストにも反映されるようにします。
  - **ports**: ホストのポート8888をコンテナのポート8888にマッピングし、Jupyter Labにアクセスできるようにします。
  - **command**: コンテナ起動時に実行するコマンドとしてJupyter Labを指定し、ブラウザを自動的に開かない設定にしています。

### 2.3 requirements.txt

```text
# requirements.txt
numpy==1.21.0
pandas==1.3.0
scikit-learn==0.24.2
matplotlib==3.4.2
seaborn==0.11.1
jupyter==1.0.0
jupyterlab==3.0.16
```

#### requirements.txtの詳細説明
このファイルには、プロジェクトで使用するPythonパッケージとそのバージョンが記載されています。例えば：

- `numpy`, `pandas`: データ操作や計算に使用されます。
- `scikit-learn`: 機械学習のためのライブラリです。
- `matplotlib`, `seaborn`: データの視覚化に使用されます。
- `jupyter`, `jupyterlab`: インタラクティブなノートブック環境を提供します。

### 2.4 .devcontainer/devcontainer.json

```json
// .devcontainer/devcontainer.json
{
    "name": "ML Environment",
    "dockerComposeFile": "../docker-compose.yml",
    "service": "ml-environment",
    "workspaceFolder": "/app",
    "settings": {
        "terminal.integrated.shell.linux": "/bin/bash"
    },
    "extensions": [
        "ms-python.python",
        "ms-toolsai.jupyter"
    ]
}
```

#### devcontainer.jsonの詳細説明
このファイルはVSCodeのRemote - Containers拡張機能で使用され、以下の設定を行います：

- **name**: コンテナ環境の名前を指定します。
- **dockerComposeFile**: 使用するDocker Composeファイルを指定します。
- **service**: コンテナ内で使用するサービスを指定します（ここでは`ml-environment`）。
- **workspaceFolder**: コンテナ内で作業するフォルダを指定します（ここでは`/app`）。
- **settings**: ターミナルのシェルをbashに設定しています。
- **extensions**: VSCode内で使用する拡張機能（PythonとJupyter）を自動でインストールします。

## ステップ3: VSCodeでプロジェクトを開く

1. VSCodeを起動します。
2. 「ファイル」→「フォルダを開く」を選択し、作成した`ml_project`フォルダを開きます。

## ステップ4: Dockerコンテナのビルドと起動

1. ターミナルを開き、以下のコマンドを実行してDockerコンテナをビルドし、起動します：
   ```bash
   docker-compose up --build
   ```
2. このコマンドにより、Dockerfileに基づいてイメージがビルドされ、Jupyter Labが起動します。

## ステップ5: コンテナ内でプロジェクトを再度開く

1. VSCodeの左下にある緑色のアイコン（または「><」アイコン）をクリックします。
![スクリーンショット 2024-09-01 23.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/cab3b517-26d7-3faf-10da-1d84b8b7588c.png)

2. 表示されるメニューから「コンテナーで再度開く」を選択します。
3. VSCodeがDockerコンテナをビルドし、プロジェクトを再度開きます（これには数分かかる場合があります）。

#### コンテナの動作場所
ここで使用しているDockerコンテナは、ホストマシン上で動作しています。ホストマシンのファイルシステムと同期しており、`volumes`ディレクティブで指定されたホストディレクトリがコンテナ内の作業ディレクトリ`/app`にマウントされます。これにより、ホストマシンのVSCodeからコンテナ内の環境でコードを直接編集・実行できます。

## ステップ6: 環境テストとしてのJupyter Notebookの作成と実行

このステップでは、セットアップが正しく行われたかを確認するために、Jupyter Notebookで簡単なデータ分析タスクを実行します。

1. VSCode内で新しいファイル「main

.ipynb」を作成します。
2. 以下のコードをセルに貼り付けます：

```python
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# データの生成
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# モデルの訓練
model = LogisticRegression()
model.fit(X_train, y_train)

# 予測と精度の計算
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

print(f"モデルの精度: {accuracy:.2f}")
```

3. VSCodeの左サイドバーで「Jupyter」アイコンをクリックし、`main.ipynb`を開きます。
4. 各セルを順番に実行し、出力される結果が期待通りであることを確認します。

このNotebookは、環境が正しくセットアップされているかを確認するためのテスト用です。簡単なデータ分析タスクを実行することで、必要なパッケージが正しくインストールされ、Jupyter Notebookが正常に動作していることを確認できます。