Windows環境でのDocker開発環境構築ガイド

【概要】WSL 2(Windows Subsystem for Linux 2)は、Windows上でLinux実行環境を提供する機能である。本ガイドでは、WSL 2を基盤としてDocker環境を構築し、Ubuntu上でPython開発環境を整備する手順を説明する。

主要コマンド一覧】以下は、本ガイドで構築する環境で使用する主要なDockerコマンドである。環境構築後のクイックリファレンスとして活用できる。

【目次】

  1. 前準備
  2. Docker Desktopのインストール、Dockerエンジンの起動
  3. Miniconda3を使用したUbuntu開発環境の構築
  4. トラブルシューティング

サイト内の関連ページ

1. 前準備

Docker Desktop for Windowsは、WSL 2(Windows Subsystem for Linux 2)をバックエンドとして使用する。Docker Desktopをインストールする前に、WSL 2を有効化しておく必要がある。

WSL 2の有効化手順は、以下のページで説明している。

Windows上のLinux開発環境構築ガイド: WSL 2とUbuntuのインストール・設定・運用: 別ページ »

  1. WSL 2の有効化状態の確認:
    • コマンドプロンプトを起動する(Windowsキーを押し、「cmd」と入力して実行)
    • 以下のコマンドを実行する:
    wsl --status
    
  2. WSL 2が使用するLinuxカーネルの更新:

    セキュリティパッチの適用や機能改善のため、以下のコマンドでアップデートを行う。

    wsl --update
    
  3. 仮想化機能の確認:

    Docker DesktopおよびWSL 2は、CPUの仮想化機能を使用する。以下の手順で有効になっているか確認する。

    • タスクマネージャーを開く(Ctrl + Shift + Esc)
    • 「パフォーマンス」タブを選択し、「仮想化: 有効」と表示されていることを確認する

2. Docker Desktopのインストール、Dockerエンジンの起動

Docker Desktopは、Dockerコンテナ、Dockerイメージ、Dockerボリュームの一覧表示、状態確認、基本的な操作を行うためのGUIアプリケーションである。

Docker Desktopは、Windowsのスタートメニューから起動できる。Docker Desktopを起動すると、Dockerエンジンが自動的に起動する。

2.1 インストール

Docker Desktopには、Dockerデーモン(バックグラウンドで動作し、コンテナを管理するサービス)とDockerクライアント(dockerコマンドを提供するツール)が含まれている。以下に2つのインストール方法を示す。

A)wingetを使用したインストール

wingetは、Windowsの公式パッケージマネージャーである。コマンドラインからアプリケーションをインストールできる。

  1. 管理者権限コマンドプロンプトを起動する。
  2. wingetが利用可能か確認する:
    winget --version
    
    winget --versionコマンドの実行結果
  3. Docker Desktopをインストールする:
    winget install --scope machine Docker.DockerDesktop
    

B)手動でのインストール

  1. Docker Desktopのダウンロード:
    • 公式サイト(https://docs.docker.com/desktop/features/wsl/#download)にアクセスする
    • インストーラをダウンロードする
  2. インストールの実行:
    • ダウンロードしたインストーラを実行する
    • 画面の指示に従ってインストールを完了する

2.2 Dockerエンジンの起動とDocker Desktopの初期設定の確認

  1. Docker Desktopの起動:
    • Windowsのスタートメニューから「Docker Desktop」を選択して起動する
  2. WSL 2バックエンドの設定確認:
    • 画面右上の設定(Settings)ボタンをクリックする
    • 「General」タブを表示する
    • 「Use WSL 2 based engine」のチェックボックスが有効になっていることを確認する
    Docker Desktop設定画面でWSL 2が有効になっている状態

3. Miniconda3を使用したUbuntu開発環境の構築

本章では、DockerコンテナとしてUbuntu環境を構築し、Miniconda3を用いてPython開発環境を整備する手順を説明する。Miniconda3の詳細については3.8節を参照のこと。

3.1 前提条件

以下の環境が整っていることを確認する。

3.2 NVIDIAドライバの確認(GPU使用時)

機械学習やディープラーニングでGPUを活用する場合、DockerコンテナからGPUにアクセスできるよう設定する。GPUを使用しない場合、本節はスキップしてよい。

nvidia-smiコマンドを実行して、NVIDIAドライバが正しくインストールされ動作しているかを確認する。

nvidia-smi

ドライバが正しく動作している場合、GPUの情報(モデル名、メモリ使用量等)が表示される。エラーが発生する場合は、NVIDIAの公式サイトから最新のドライバをインストールする。

Docker DesktopでGPUを使用するには、Dockerの設定ファイル(daemon.json)に以下の設定を追加する。このファイルは通常、C:\Users\<ユーザー名>\.docker\daemon.jsonまたは Docker Desktopの Settings > Docker Engine から編集できる。

{
  "features": {"buildkit": true},
  "experimental": true,
  "runtimes": {
    "nvidia": {
      "path": "nvidia-container-runtime",
      "runtimeArgs": []
    }
  }
}

3.3 Dockerfileの作成

Dockerfileは、Dockerイメージを構築するための設定ファイルである。ベースイメージの指定、パッケージのインストール、環境設定などを記述する。

  1. コマンドプロンプトを起動する。
  2. 以下のコマンドを実行してDockerfileを作成する:
    notepad Dockerfile
    
    notepadコマンドでDockerfileを開く
  3. Dockerfileに以下の内容を記述して保存する:

    このDockerfileは、Ubuntu 24.04 LTS(Long Term Support: 長期サポート版)をベースイメージとして使用し、Python開発環境を構築する。Miniconda3を用いてPython 3.12環境を作成し、NumPy、Pandas等の科学技術計算ライブラリを導入する。また、Jupyter Notebookをポート8888で起動するよう設定し、cmake、git等の開発ツールも導入する。

    FROM ubuntu:24.04
    
    # 環境変数の設定
    # DEBIAN_FRONTEND=noninteractive: パッケージインストール時の対話的プロンプトを抑制
    ENV PATH=/opt/conda/bin:$PATH \
        SHELL=/bin/bash \
        DEBIAN_FRONTEND=noninteractive
    
    # システムパッケージのインストール
    RUN apt-get update && apt-get upgrade -y && \
        apt-get install -y wget curl git cmake build-essential ufw && \
        rm -rf /var/lib/apt/lists/*
    
    # Miniconda3のインストール
    RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \
        bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda && \
        rm Miniconda3-latest-Linux-x86_64.sh
    
    # condaの初期設定とdev環境の作成
    RUN /opt/conda/bin/conda init bash && \
        echo ". /opt/conda/etc/profile.d/conda.sh" >> /root/.bashrc
    
    RUN /opt/conda/bin/conda create -n dev python=3.12 -y && \
        /opt/conda/bin/conda install -n dev -y numpy pandas matplotlib scikit-learn jupyter pylint pytest black && \
        echo "conda activate dev" >> /root/.bashrc
    
    # Jupyterの設定
    RUN mkdir -p /root/.jupyter && \
        echo "c.NotebookApp.ip = '*'" >> /root/.jupyter/jupyter_notebook_config.py && \
        echo "c.NotebookApp.port = 8888" >> /root/.jupyter/jupyter_notebook_config.py && \
        echo "c.NotebookApp.allow_root = True" >> /root/.jupyter/jupyter_notebook_config.py
    
    # 作業ディレクトリの設定
    WORKDIR /workspace
    
    # Jupyterのポートを公開
    EXPOSE 8888
    
    # コンテナ起動時のコマンド
    CMD ["bash", "-c", ". /opt/conda/etc/profile.d/conda.sh && conda activate dev && \
         jupyter notebook --allow-root --ip=* --port=8888 --no-browser"]
    

3.4 Dockerイメージのビルド

コマンドプロンプトで、以下のdocker buildコマンドを実行する。このコマンドは、カレントディレクトリのDockerfileを基にイメージを生成する。初回のビルドには数分から十数分かかる場合がある。

docker build -t myubuntu2404:1.0 .

作成したイメージには、識別用の名前(例: myubuntu2404)とバージョン管理用のタグ(例: 1.0)を設定できる。タグを活用することで、環境の変更履歴を管理しやすくなる。

ビルド完了後、docker imagesコマンドにより、ローカルに保存されたイメージの一覧を表示できる。

docker images
docker buildコマンドの実行結果

3.5 コンテナの作成と実行

コマンドプロンプトで、以下のコマンドを実行してコンテナを作成・起動する。

docker run --name myubuntu --restart unless-stopped -p 8888:8888 -it myubuntu2404:1.0 /bin/bash

以下は、コンテナ内でLinuxコマンド(pwd、ls)を実行し、「exit」で切断する例である。

docker runコマンド実行後のコンテナ内操作例

各オプションの説明:

3.6 環境の確認

コンテナが正しく構築されたことを確認するため、以下のコマンドを実行する。

3.7 Docker運用上の注意点

Dockerを運用する際は、データのバックアップとリソース監視が重要である。コンテナを削除すると内部のデータも失われるため、重要なデータはボリュームに保存し、定期的にバックアップを取得する。

ボリュームのバックアップと復元

Dockerボリュームの内容をtar形式(複数のファイルを1つにまとめるアーカイブ形式)でバックアップ・復元できる。

コンテナのリソース監視

コンテナの動作状況を監視することで、問題の早期発見や性能の最適化に役立てることができる。

# コンテナのリソース使用状況(CPU、メモリ等)を確認
docker stats myubuntu

# コンテナ内で実行中のプロセスを確認
docker top myubuntu

# コンテナのログを確認
docker logs myubuntu

# 直近の100行のログを表示
docker logs --tail 100 myubuntu

リソース使用量が高い場合は、必要に応じてリソース制限を設定する。異常な動作やエラーを早期に発見するため、ログを定期的に確認する。

3.8 Miniconda3の説明

Miniconda3は、Pythonとconda(パッケージ管理システム)を含む軽量なディストリビューションである。本節では、Miniconda3の基本的な使い方を説明する。

Miniconda3の概要と機能

condaを使用してパッケージをインストールできる。condaは依存関係を自動的に解決し、互換性のあるバージョンをインストールする。また、プロジェクトごとに独立した仮想環境を作成できるため、異なるプロジェクトで異なるバージョンのライブラリを使用できる。Windows、Linux、macOSに対応しており、Pythonの複数バージョンを管理して共存させることも可能である。

基本コマンド:

Miniconda3とpipの併用

Miniconda3とpipを同じ環境で使用する際は注意が必要である。condaとpipは異なる方法でパッケージを管理するため、競合が発生する可能性がある。基本的には、どちらか一方のパッケージマネージャーを使用することが推奨される。

特定のパッケージがcondaで利用できない場合にはpipを使用する。その際は、新しいconda環境を作成し、その環境内でpipを使用することを推奨する。これにより、他の環境への影響を回避できる。

conda create -n myenv python=<version>
conda activate myenv
pip install --upgrade-strategy only-if-needed <package_name>

--upgrade-strategy only-if-neededオプションは、依存関係が必要な場合にのみ関連するパッケージをアップグレードする設定である。

Miniconda3環境設定のバックアップと再現

環境設定をファイルにエクスポートすることで、同一の環境を別のマシンで再現できる。チーム開発や環境の移行に有用である。

# 現在の環境設定をエクスポート
conda env export > environment.yml

# エクスポートした環境の内容確認
cat environment.yml

# 別の環境で環境を再現
conda env create -f environment.yml

environment.ymlには、Pythonバージョンやパッケージ情報が記録される。パッケージのバージョンも明示的に記録されるため、同一の環境を再現できる。

Miniconda3のトラブルシューティング

環境の作成やアクティベートに失敗する場合、既存の環境を削除して新しい環境を作成する。以下のコマンドを使用する。

conda remove --name <env_name> --all
conda create --name <new_env_name> python=<version>
conda activate <new_env_name>

必要なデータは事前に保存する必要がある。

4. トラブルシューティング

4.1 wingetでのインストールの問題

  1. wingetの更新:
    winget upgrade
    
  2. キャッシュのクリア:
    winget source reset
    
  3. よくある問題と対処:
    • 「プログラムが見つかりません」エラー:
      winget source update
      
      上記コマンドでパッケージリストを更新する。
    • インストールが途中で止まる場合:
      • 管理者権限でコマンドプロンプトを開いて再度実行する
      • または手動インストールに切り替える

4.2 コンテナとイメージとボリュームの破棄

Docker環境に問題が発生し、初期状態からやり直したい場合や、ディスク容量を解放したい場合に、以下の手順でDocker環境を完全にリセットできる。

注意: 以下のコマンドを実行すると、実行中のものも含め、すべてのコンテナ、イメージ、ボリュームが破棄される。この操作は元に戻すことができない。必要なデータは事前に保存する必要がある。

  1. すべての実行中コンテナを停止して削除:
    for /f "tokens=*" %i in ('docker ps -a -q') do docker stop %i
    for /f "tokens=*" %i in ('docker ps -a -q') do docker rm %i
    
  2. すべてのイメージを強制削除:
    for /f "tokens=*" %i in ('docker images -a -q') do docker rmi -f %i
    
  3. 未使用のリソースの一括削除:
    docker system prune -a --volumes
    

    -aオプションは未使用イメージも含めて削除する。--volumesオプションは未使用ボリュームも削除する。

  4. Docker Desktopの再起動:
    • タスクトレイのDockerアイコンを右クリックし、「Restart」を選択する
  5. Docker設定の完全リセット:
    • Docker Desktopを終了する
    • タスクトレイのDockerアイコンを右クリックし、「Troubleshoot」から「Clean / Purge data」を選択する
    • 「Reset to factory defaults」オプションを選択する