
「同じコードなのに、相手の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分メニュー)
- プロジェクト直下にDockerfileとrequirements.txtを置いて
docker build
。 docker run -p 8888:8888 -v $(pwd):/work
でJupyter起動(Windowsは${PWD}
)。- .dockerignoreを追加してビルド時間を削減。
- 余裕があればdocker-compose.ymlと.devcontainer/を追加して“起動を一言”に。
まとめ:環境は“箱で渡す”
Dockerで再現性・衝突ゼロ・配布の簡単さをセットで手に入れましょう。テンプレはすべて掲載済み。今日の案件から、箱で渡す運用に切り替えてOKです。
-
-
Python環境構築の最適解:venv・pip・Condaの使い分け【保存版】
Pythonの環境づくり、結局「venv」「pip」「Anaconda(Conda)」のどれから始めればいいの? 最短で沼らず、あとから壊れないやり方が知りたい…! そんなモヤモヤを一気に解決するため ...
-
-
もう壊れないPython環境:venv×pip-toolsで作る再現可能な依存管理
仮想環境や依存関係、気づくと壊れていませんか?「昨日は動いたのに、今日は動かない…」 軽くて再現性が高く、アップデートもしやすい“ちょうど良い運用”が知りたい! 答えはシンプルです。venv × pi ...
-
-
【保存版】Jupyter Notebookの基本:環境構築・使い方・再現性・“読みやすいノート”設計まで完全ガイド
Jupyter Notebookは学習・検証・共有に最強の道具ですが、設計を間違えると再現できない・読みにくい・遅いノートになってしまいます。本記事は、未経験〜初学者が週10時間×1〜2週で、環境構築 ...
-
-
もう事故らせない:PythonでCSV/JSON/Excelを安全に読み書きする実務レシピ
CSV/JSON/Excelの読み書き、どこから気をつければいい? 文字化け・先頭ゼロ欠落・壊れたExcel……もう事故らせたくない! 結論:データ仕事の9割はI/O(入出力)。ここを整えるだけで、桁 ...
-
-
自動化:スケジューリングと業務改善の型|「再実行安全×観測可能×静かに動く」を仕組みにする
夜中に動かしているPython、自動で止まってた…ログもなくて原因が追えない…。 「毎朝のレポート」や「在庫監視」を、壊れず静かに回したい…! 業務で落ちない自動化を作る鍵は、(1) 再実行安全(Id ...
TechAcademy データサイエンスコース(受講料:174,600円~ ※更に割引あり)

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

最近のコメント