Python基礎

Docker超入門:学習環境を箱ごと保存する|“同じ環境が誰でも動く”を最小コストで実現

「同じコードなのに、相手のPCだと動かない…」——そのモヤモヤ、今日で終わらせましょう。

結論:学習や副業納品では、“環境を箱ごと固定”=Dockerが最強の近道です。再現性、衝突ゼロ、配布の簡単さを一気に手に入れます。本記事は最小Dockerfile → Jupyter起動 → 依存固定(pip-tools) → docker-compose → VSCode Dev Containersまでを、コピペで使えるテンプレとしてまとめました。Windows/Mac/WSL2の差分や権限・ポート競合など、つまずきやすいポイントも先回りで解決します。

この記事で身に付く力

  • 誰のPCでも同じように動く“箱入り環境”の作り方
  • Jupyterをワンコマンドで起動・共有する実務テンプレ
  • 依存固定・ビルド高速化・権限/ポート問題の実践解決

なぜDocker?——“動かない・汚れる・再現できない”を一掃

現場でよく起きるのはこの3つ。

  • 他人のPCで動かない:Pythonやライブラリ、OSの差でImportError連発。
  • 自分のPCが汚れる:複数プロジェクトの依存が衝突して復旧に半日。
  • 再現できない:Notebookだけ渡され「で、バージョンは?」から会議が始まる。

Dockerは、ミニLinux+Python+依存をひとかたまりにした“”。この箱を配れば、いつ・どこでも同じ挙動を保証できます。筆者(ふみと)は社内共有・副業納品で、Docker化した瞬間にレビュー速度と信頼が跳ね上がった経験があります。ここから実務テンプレを配布していきます。

まずは最小構成でJupyterを起動(コピペOK)

以下のDockerfileは、Python 3.12 + JupyterLabを最短で立ち上げる最小構成です。Linux/Mac/WSL2/Windows(PowerShell)での起動コマンドも用意しました。

# Dockerfile
FROM python:3.12-slim

# OSパッケージ最小限

RUN apt-get update 
&& apt-get install -y --no-install-recommends build-essential curl 
&& rm -rf /var/lib/apt/lists/\*

# 非rootユーザ(Linuxでの権限問題を避ける)

ARG UID=1000 GID=1000
RUN groupadd -g $GID app && useradd -m -u $UID -g $GID app

WORKDIR /work

# 依存をレイヤ分離するとビルドが速い

COPY requirements.txt /work/requirements.txt
RUN python -m pip install -U pip 
&& pip install --no-cache-dir -r requirements.txt

# プロジェクト本体(最初は空でもOK)

COPY . /work

# 既定コマンド:JupyterLab

EXPOSE 8888
USER app
CMD \["python","-m","jupyter","lab","--ip=0.0.0.0","--port=8888","--no-browser","--NotebookApp.token="]
jupyterlab>=4
numpy>=2
pandas>=2.2
matplotlib>=3.9
scikit-learn>=1.5
# 1) イメージを作る
docker build -t py-lab:latest .

# 2) /work にカレントをマウントし、Jupyterを公開

# Linux/Mac/WSL2

docker run --rm -it -p 8888:8888 -v "$(pwd)":/work py-lab\:latest

# Windows PowerShell

docker run --rm -it -p 8888:8888 -v ${PWD}:/work py-lab\:latest

# ブラウザで [http://localhost:8888](http://localhost:8888) へ
.git
__pycache__
.ipynb_checkpoints
work/
.env
*.csv
*.parquet

依存の“気持ちいい固定”——pip-tools(任意)

人が編集するのはrequirements.inだけ。pip-compileでピン止め済みのrequirements.txtを生成し、Dockerfileでは.txtだけCOPYします。これで差分ビルドが爆速に。

jupyterlab
numpy
pandas
matplotlib
scikit-learn
pip install pip-tools
pip-compile requirements.in -o requirements.txt

docker-composeで“長い run”を一言に

services:
  lab:
    build: .
    image: py-lab:latest
    container_name: pylab
    ports: ["8888:8888"]
    volumes:
      - .:/work
    user: "${UID:-1000}:${GID:-1000}"
    environment:
      - TZ=Asia/Tokyo
      - PYTHONUNBUFFERED=1
docker compose up --build  # 初回/変更時
docker compose up          # 起動
docker compose down        # 停止

Linuxで生成ファイルがroot所有になる場合は、composeのuser: "${UID}:${GID}"で回避(Windows/Macは通常不要)。

VSCode Dev Containersで開発体験を爆上げ

{
  "name": "py-lab",
  "build": { "dockerfile": "Dockerfile" },
  "mounts": ["source=${localWorkspaceFolder},target=/work,type=bind"],
  "workspaceFolder": "/work",
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-python.python",
        "ms-toolsai.jupyter",
        "ms-python.vscode-pylance"
      ]
    }
  },
  "postCreateCommand": "python -m pip install -U pip"
}

Remote-Containers: Reopen in Containerで、拡張機能ごと固定化された同一環境に入れます。チーム開発や提出テンプレに最適です。

“速く・小さく”作る実務コツ

  • ベースはpython:slim系:AlpineはC依存ライブラリで詰みやすい。
  • レイヤ設計:COPY requirements.txt → pip install → 最後にコード。依存が変わらなければ激速。
  • ビルド不要に寄せる:可能ならmanylinuxホイールのあるライブラリを選定。
  • 社内CIではwheelキャッシュ:pip wheelでホイール倉庫化。
  • マルチステージ:ビルド/ランタイムを分離して軽量化。
FROM python:3.12-slim AS wheels
WORKDIR /w
COPY requirements.txt .
RUN pip wheel --no-deps -r requirements.txt -w /wheels

FROM python:3.12-slim
WORKDIR /work
COPY --from=wheels /wheels /wheels
RUN pip install --no-index --find-links=/wheels -r /wheels/../requirements.txt
COPY . /work

スクリプト実行・テスト・自動化につなぐ

# ローカルを /work にマウントしてスクリプト実行
docker run --rm -v "$(pwd)":/work py-lab:latest python scripts/run_etl.py
docker run --rm -v "$(pwd)":/work py-lab:latest pytest -q

スケジューリングは、[内部リンク:自動化:スケジューリングと業務改善の型]cronやGitHub Actionsと接続して回します。

よくあるハマりと回避(早見表)

症状原因回避
permission denied(生成ファイルがroot所有)Linuxでroot実行--user $(id -u):$(id -g) または composeのuser:指定
Jupyterにアクセスできないポート未公開 / --ip未設定-p 8888:8888、CMDに--ip=0.0.0.0
8888が競合既にJupyter起動中-p 8890:8888など別ポートへ
ビルドが遅い依存レイヤが毎回無効化requirements.txtを先にCOPY→pip install→最後にコード
numpy/scipyのビルド失敗Alpine+musl/ビルド依存不足slim系を使う、build-essential/gfortran追加
日本語CSVが文字化けロケール/エンコーディングコンテナ内でencoding='cp932'等を指定([内部リンク:ファイル操作:CSV/JSON/Excelの読み書き]
Windowsの改行問題git core.autocrlf.gitattributes*.sh text eol=lfなど、入口はPythonに

いつDocker? いつvenv/conda?(現実解)

  • Docker:配布(他PC/他OS/納品/教育)、DBやRedisと連携、再現性が最重要な場面。
  • venv/conda:手元の単体検証、軽量試行、GUIツールが多いとき。

学習の最初はvenv、共有や提出物はDocker——これが筆者の定番です。

ユースケース別の第一手(すぐ使える)

  • 授業/社内勉強会:本記事のDockerfile+docker compose upで全員同じ。資料にはポート番号を明記。
  • 副業納品:py-lab:latestにスクリプト実行例とサンプルデータ同梱。READMEに起動1行+保存先
  • Notebookレビュー:Dev Containersで拡張機能ごと固定。依存はpip-compileでピン止め。

今日やること(45分メニュー)

  1. プロジェクト直下にDockerfilerequirements.txtを置いてdocker build
  2. docker run -p 8888:8888 -v $(pwd):/workでJupyter起動(Windowsは${PWD})。
  3. .dockerignoreを追加してビルド時間を削減。
  4. 余裕があればdocker-compose.yml.devcontainer/を追加して“起動を一言”に。

まとめ:環境は“箱で渡す”

Dockerで再現性・衝突ゼロ・配布の簡単さをセットで手に入れましょう。テンプレはすべて掲載済み。今日の案件から、箱で渡す運用に切り替えてOKです。

Python環境
Python環境構築の最適解:venv・pip・Condaの使い分け【保存版】

Pythonの環境づくり、結局「venv」「pip」「Anaconda(Conda)」のどれから始めればいいの? 最短で沼らず、あとから壊れないやり方が知りたい…! そんなモヤモヤを一気に解決するため ...

Python環境
もう壊れないPython環境:venv×pip-toolsで作る再現可能な依存管理

仮想環境や依存関係、気づくと壊れていませんか?「昨日は動いたのに、今日は動かない…」 軽くて再現性が高く、アップデートもしやすい“ちょうど良い運用”が知りたい! 答えはシンプルです。venv × pi ...

Jupyter Notebookの基本
【保存版】Jupyter Notebookの基本:環境構築・使い方・再現性・“読みやすいノート”設計まで完全ガイド

Jupyter Notebookは学習・検証・共有に最強の道具ですが、設計を間違えると再現できない・読みにくい・遅いノートになってしまいます。本記事は、未経験〜初学者が週10時間×1〜2週で、環境構築 ...

事故防止・効率化
もう事故らせない:PythonでCSV/JSON/Excelを安全に読み書きする実務レシピ

CSV/JSON/Excelの読み書き、どこから気をつければいい? 文字化け・先頭ゼロ欠落・壊れたExcel……もう事故らせたくない! 結論:データ仕事の9割はI/O(入出力)。ここを整えるだけで、桁 ...

自動化
自動化:スケジューリングと業務改善の型|「再実行安全×観測可能×静かに動く」を仕組みにする

夜中に動かしているPython、自動で止まってた…ログもなくて原因が追えない…。 「毎朝のレポート」や「在庫監視」を、壊れず静かに回したい…! 業務で落ちない自動化を作る鍵は、(1) 再実行安全(Id ...

TechAcademy データサイエンスコース(受講料:174,600円~ ※更に割引あり)

TechAcademy 無料相談

株式会社キカガク AI人材長期育成コース(受講料:237,600円~)

キカガク 無料相談

最近のコメント

    • この記事を書いた人
    • 最新記事

    ふみと

    このブログでは、データサイエンティストとして市場価値を上げる方法を独自にまとめて発信しています。

    【プロフィール】
    ・大手企業データサイエンティスト/マーケティングサイエンティスト(10年、年収900万円台)/案件100件以上
    ・資格:JDLA E資格(日本ディープラーニング協会主催)/JDLA Community(CDLE会員)/Advanced Marketer/ビジネス統計スペシャリスト/統計検定2級/TOEIC 805
    ・スキル:Python/Tableau/SQL/機械学習/Deep Learning/RPA

    -Python基礎