Windows環境でのDocker開発環境構築ガイド
【概要】WSL 2(Windows Subsystem for Linux 2)は、Windows上でLinux実行環境を提供する機能である。本ガイドでは、WSL 2を基盤としてDocker環境を構築し、Ubuntu上でPython開発環境を整備する手順を説明する。
【主要コマンド一覧】本ガイドで構築する環境で使用する主要なDockerコマンドを以下に示す。
- Dockerイメージのビルド: docker build -t myubuntu2404:1.0 .
- イメージからのコンテナの作成と実行: docker run --name myubuntu -p 8888:8888 -it myubuntu2404:1.0 /bin/bash
- 実行中の myubuntu コンテナに接続: docker exec -it myubuntu /bin/bash
- 停止中の myubuntu コンテナを実行中(Up)にする: docker start myubuntu
- 実行中の myubuntu コンテナを停止(Exited)する: docker stop myubuntu
- 実行中または停止中のコンテナの一覧表示: docker ps -a
【目次】
【サイト内の関連情報】
- Windows の基本操作・コマンド操作・設定と、アプリ・開発環境・ローカル AI の導入
- Linux基本コマンドとその活用法:別ページで説明
1. 前準備
Docker Desktop for Windowsは、WSL 2(Windows Subsystem for Linux 2)をバックエンドとして使用する。Docker Desktopをインストールする前に、WSL 2を有効化しておく必要がある。
WSL 2の有効化手順は、以下のページで説明している。
Windows上のLinux開発環境構築ガイド: WSL 2とUbuntuのインストール・設定・運用: 別ページ »
- WSL 2の有効化状態の確認:
- コマンドプロンプトを起動する(Windowsキーを押し、「cmd」と入力して実行する)
- 以下のコマンドを実行する:
wsl --status - WSL 2が使用するLinuxカーネルの更新:
wsl --update - 仮想化機能の確認:
Docker DesktopおよびWSL 2は、CPUの仮想化機能を使用する。
- タスクマネージャーを開く(Ctrl + Shift + Esc)
- 「パフォーマンス」タブを選択し、「仮想化: 有効」と表示されていることを確認する
- 無効の場合は、UEFI/BIOS設定で仮想化支援機能を有効にする
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の公式パッケージマネージャーであり、コマンドラインからアプリケーションをインストールできる。
- 管理者権限でコマンドプロンプトを起動する
(手順:Windowsキーまたはスタートメニュー →
cmdと入力 → 右クリック → 「管理者として実行」)。 - wingetが利用可能か確認する:
winget --version
- Docker Desktopをインストールする:
winget install --scope machine Docker.DockerDesktop
B)手動でのインストール
- 公式サイト(https://docs.docker.com/desktop/setup/install/windows-install/)からインストーラをダウンロードする。
- ダウンロードしたインストーラを実行する。
2.2 Dockerエンジンの起動とDocker Desktopの初期設定の確認
- Docker Desktopの起動:
- Windowsのスタートメニューから「Docker Desktop」を選択して起動する
- WSL 2バックエンドの設定確認:
- 画面右上の設定(Settings)ボタンをクリックする
- 「General」タブを表示する
- 「Use WSL 2 based engine」のチェックボックスが有効になっていることを確認する
3. Miniconda3を使用したUbuntu開発環境の構築
本章では、DockerコンテナとしてUbuntu環境を構築し、Miniconda3を用いてPython開発環境を整備する手順を説明する。Miniconda3の詳細については3.8節を参照のこと。
3.1 前提条件
- WSL 2が有効化されていること(1章参照)
- Docker Desktop for Windowsがインストール済みであること(2章参照)
- NVIDIAグラフィックドライバーがインストール済みであること(GPU使用時のみ)
3.2 NVIDIAドライバの確認(GPU使用時)
機械学習やディープラーニングでGPUを利用する場合、DockerコンテナからGPUにアクセスできるよう設定する。GPUを使用しない場合、本節はスキップしてよい。
Windowsホスト側で以下のnvidia-smiコマンドを実行し、NVIDIAドライバが正しくインストールされ動作しているかを確認する。
nvidia-smi
ドライバが正しく動作している場合、GPUの情報(モデル名、メモリ使用量等)が表示される。エラーが発生する場合は、NVIDIAの公式サイトから最新のドライバをインストールする。
Docker Desktop(WSL 2バックエンド)では、WSL 2を通じてGPUが利用可能になる。コンテナからGPUを使用する場合は、docker runコマンドに--gpus allオプションを付与する。コンテナからGPUを認識できるかは、CUDAのベースイメージを用いて以下のコマンドで確認できる。
docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi
3.3 Dockerfileの作成
Dockerfileは、Dockerイメージを構築するための設定ファイルである。ベースイメージ(イメージ作成の土台となる既存のイメージ)の指定、パッケージのインストール、環境設定などを記述する。
- コマンドプロンプトを起動する。
- 以下のコマンドを実行してDockerfileを作成する:
notepad Dockerfile
- Dockerfileに以下の内容を記述して保存する:
このDockerfileは、Ubuntu 24.04 LTS(Long Term Support: 長期サポート版)をベースイメージとして使用し、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 install -y wget curl git cmake ca-certificates build-essential && \ 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.ServerApp.ip = '0.0.0.0'" >> /root/.jupyter/jupyter_notebook_config.py && \ echo "c.ServerApp.port = 8888" >> /root/.jupyter/jupyter_notebook_config.py && \ echo "c.ServerApp.allow_root = True" >> /root/.jupyter/jupyter_notebook_config.py # 作業ディレクトリの設定 WORKDIR /workspace # Jupyterのポートを公開 EXPOSE 8888 # コンテナ起動時のコマンド CMD ["/opt/conda/envs/dev/bin/jupyter", "notebook", "--allow-root", "--ip=0.0.0.0", "--port=8888", "--no-browser"]
3.4 Dockerイメージのビルド
コマンドプロンプトで、以下のdocker buildコマンドを実行する。このコマンドは、カレントディレクトリ(Dockerfileを保存したディレクトリ)のDockerfileを基にイメージを生成する。
docker build -t myubuntu2404:1.0 .
作成したイメージには、識別用の名前(例: myubuntu2404)とタグ(例: 1.0)を設定できる。タグを利用することで、環境のバージョンを区別できる。
ビルド完了後、docker imagesコマンドにより、ローカルに保存されたイメージの一覧を表示できる。
docker images
3.5 コンテナの作成と実行
コマンドプロンプトで、以下のコマンドを実行してコンテナを作成・起動する。
docker run --name myubuntu -p 8888:8888 -it myubuntu2404:1.0 /bin/bash
以下は、コンテナ内でLinuxコマンド(pwd、ls)を実行し、「exit」で切断する例である。
各オプションの説明:
--name myubuntu: コンテナに識別用の名前を付与する-it: コンテナと対話的に操作できるようにする(-i: 標準入力を開く、-t: ターミナルを割り当てる)-p 8888:8888: ホストのポート8888をコンテナのポート8888にマッピングする(Jupyter Notebook用)myubuntu2404:1.0: 使用するイメージとタグを指定する/bin/bash: コンテナ起動時に実行するコマンド。これを指定するとDockerfileのCMD(Jupyter Notebookの起動)が上書きされ、bashが起動する
Jupyter Notebookをサービスとして常時起動する場合は、/bin/bashを指定せずに-d --restart unless-stoppedを付与して起動する。
docker run --name jupyter -d --restart unless-stopped -p 8888:8888 myubuntu2404:1.0
3.6 環境の確認
コンテナが正しく構築されたことを確認するため、以下のコマンドを実行する。
- コンテナへの接続: 実行中のmyubuntuコンテナに接続する。「exit」で切断できる。
docker exec -it myubuntu /bin/bash exit
- dev環境のPythonバージョンの確認:
docker execは.bashrcを読み込まないため、フルパスで指定する。docker exec myubuntu /opt/conda/envs/dev/bin/python --version
- conda環境情報の確認:
docker exec myubuntu conda info
- conda環境一覧の確認:
docker exec myubuntu conda env list
- dev環境のインストール済みパッケージの確認:
docker exec myubuntu conda list -n dev
3.7 Docker運用上の注意点
コンテナを削除すると内部のデータも失われるため、必要なデータはボリューム(コンテナの外でデータを保持するDockerの保存領域)に保存する。
ボリュームのバックアップと復元
Dockerボリュームの内容をtar形式(複数のファイルを1つにまとめるアーカイブ形式)でバックアップ・復元できる。以下のコマンドはコマンドプロンプトで実行する。
- ボリュームの内容をtarファイルにバックアップする:
docker run --rm -v app-data:/data -v %cd%:/backup ubuntu tar czvf /backup/app-data-backup.tar.gz /data - バックアップからボリュームを復元する:
docker run --rm -v app-data:/data -v %cd%:/backup ubuntu tar xzvf /backup/app-data-backup.tar.gz -C /--rmオプションは、コマンド実行後にコンテナを自動的に削除する。%cd%はコマンドプロンプトのカレントディレクトリを表す。
コンテナのリソース監視
以下のコマンドで、コンテナのリソース使用状況やログを確認できる。
REM コンテナのリソース使用状況(CPU、メモリ等)を確認
docker stats myubuntu
REM コンテナ内で実行中のプロセスを確認
docker top myubuntu
REM コンテナのログを確認
docker logs myubuntu
REM 直近の100行のログを表示
docker logs --tail 100 myubuntu
3.8 Miniconda3の説明
Miniconda3は、Pythonとconda(パッケージ管理システム)を含む軽量なディストリビューションである。本節では、Miniconda3の基本的な使い方を説明する。
Miniconda3の概要と機能
condaを使用してパッケージをインストールできる。condaは依存関係を自動的に解決し、互換性のあるバージョンをインストールする。また、プロジェクトごとに独立した仮想環境を作成できるため、異なるプロジェクトで異なるバージョンのライブラリを使用できる。Windows、Linux、macOSに対応しており、環境ごとに異なるバージョンのPythonを共存させることも可能である。
基本コマンド:
- 環境の作成: conda create -n <env_name> python=<version>
- 環境のアクティベート: conda activate <env_name>
- パッケージのインストール: conda install <package_name>
- 環境の一覧表示: conda env list
- 環境の削除: conda remove -n <env_name> --all
- 環境のバックアップ: conda env export > environment.yml
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環境設定のバックアップと再現
環境設定をファイルにエクスポートすることで、同一の環境を別のマシンで再現できる。
REM 現在の環境設定をエクスポート
conda env export > environment.yml
REM エクスポートした環境の内容確認
type environment.yml
REM 別の環境で環境を再現
conda env create -f environment.yml
environment.ymlには、Pythonバージョンやパッケージ情報がバージョンとともに記録される。
Miniconda3のトラブルシューティング
環境の作成やアクティベートに失敗する場合、既存の環境を削除して新しい環境を作成する。環境の削除前に、conda env exportで環境定義を保存しておく。
conda remove --name <env_name> --all
conda create --name <new_env_name> python=<version>
conda activate <new_env_name>
4. トラブルシューティング
4.1 wingetでのインストールの問題
- wingetの更新:
winget upgrade - キャッシュのクリア:
winget source reset - よくある問題と対処:
- 「プログラムが見つかりません」エラーの場合、以下のコマンドでパッケージリストを更新する:
winget source update - インストールが途中で止まる場合:
- 管理者権限でコマンドプロンプトを開いて再度実行する
- または手動インストールに切り替える
- 「プログラムが見つかりません」エラーの場合、以下のコマンドでパッケージリストを更新する:
4.2 コンテナとイメージとボリュームの破棄
Docker環境に問題が発生し、初期状態からやり直したい場合や、ディスク容量を解放したい場合に、以下の手順でDocker環境をリセットできる。実行中のものも含め、すべてのコンテナ、イメージ、ボリュームが破棄され、この操作は元に戻せないため、必要なデータは3.7節の手順で事前に保存する。
- すべてのコンテナを停止して削除:
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 - すべてのイメージを強制削除:
for /f "tokens=*" %i in ('docker images -a -q') do docker rmi -f %i - 未使用のリソースの一括削除:
docker system prune -a --volumes-aオプションは未使用イメージも含めて削除する。--volumesオプションは未使用ボリュームも削除する。 - Docker Desktopの再起動:
- タスクトレイのDockerアイコンを右クリックし、「Restart」を選択する
- Docker設定の完全リセット:
- Docker Desktopを終了する
- タスクトレイのDockerアイコンを右クリックし、「Troubleshoot」から「Clean / Purge data」を選択する
- 「Reset to factory defaults」オプションを選択する