Dockerコンテナを使ってバージョンの異なるPython環境を複数環境作る方法
異なるバージョンのPythonで検証する意義
開発現場では現行のシステムを維持しながら更改案件の開発をすることがあると思います。そんなときに、違ったPythonのバージョンの開発環境が欲しくなったりしませんか?
pyenvで仮想環境を作る方法もありますが、Dockerコンテナで作成する方法を紹介します。
Dockerコンテナで商用サービスしている場合は簡単に開発環境ができ、商用リリースとの親和性もあがると思います。
pyenvとDockerコンテナのPython仮想環境の違い
| 項目 | pyenv + venv | Docker コンテナ |
|---|---|---|
| 主な用途 | Python バージョン管理と仮想環境構築 | アプリケーション全体の環境構築 |
| 分離レベル | Python のみ(パッケージ・バージョン) | OSレベル(ファイルシステム・ネットワーク含む) |
| 再現性 | 開発環境での再現性は高いが、本番環境とは差が出ることも | 開発・テスト・本番で完全に同一環境を再現可能 |
| 外部依存の管理 | Python パッケージのみ | Python 以外の依存(DB, Node.js など)も管理可能 |
| 本番環境への適用 | 基本的にローカル開発向け | 本番環境でもそのまま運用可能 |
| OS依存性 | OS に依存する(macOS/Linux/Windowsで挙動が異なる) | OSに依存せず、どこでも同じ動作が可能 |
複数バージョンのPythonコンテナの作成
(前提)
Docker Desktop等のDocker Engineがインストールできていること。
本説明はWindows環境での説明となりますが、フォルダの記載ルールをご利用のOSに合わせていただくことで問題なくほかのOSでも実行できます。
(構築するコンテナ)
- Python 3.11
- Python 3.12
今回の構成のコンセプト
ローカルのフォルダをコンテナにマウントして、ローカルのPythonコードを修正するとシームレスにコンテナ側に反映されるようにします。
これで、ローカルのPCのVscodeなどで開発をしながら即時で試験ができるようになります。

マウント用のフォルダ作成
- コーディングするフォルダをローカルに作成します。
C:\python\version311
C:\python\version312
コンテナの起動
マウントオプション(-v)のWindowsのフォルダはUnix形式にします(""→"/"に変更)
- python3.11環境を作成
docker run -it -v C:/python/version311:/usr/local/src python:3.11 bash
#実行結果(プロンプトが立ち上がれば成功です)
root@6054880e6b1f:/#
- python3.12環境を作成(別のプロンプトを立ち上げてから実行してください)
docker run -it -v C:/python/version312:/usr/local/src python:3.12 bash
#実行結果(プロンプトが立ち上がれば成功です)
root@23ac76e099f5:/#
- 解説
| オプション | 説明 |
|---|---|
docker run |
新しいコンテナを起動する基本コマンド |
-it |
対話モードで起動(標準入力と端末を接続) |
-v C:/python/version311:/usr/local/src |
ホスト側の C:/python/version311 をコンテナ内の /usr/local/src にマウント |
python:3.11 |
使用する Docker イメージ(Python 3.11) |
bash |
コンテナ内で bash シェルを起動 |
コーディング
-
python3.11環境
C:\python\version311 にpython.pyを作成し、"version3.11"と出力するコードを記載して保存します。

-
python3.12環境
C:\python\version312 にpython.pyを作成し、"version3.12"と出力するコードを記載して保存します。

Pythonファイルの実行
- python3.11環境
python3.11環境を起動したプロンプトでpython.pyを実行
python /usr/local/src/python.py
# 出力結果
version3.11
- python3.12環境
python3.12環境を起動したプロンプトでpython.pyを実行
python /usr/local/src/python.py
# 出力結果
version3.12
それぞれバージョンのPython環境ができ、Pythonファイルが実行できましたね。
Dockerコンテナの停止・起動について
コンテナのプロセスを確認
ふたつのコンテナが起動(Up)となっていることを確認します。
docker ps
# 出力結果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
23ac76e099f5 python:3.12 "bash" 6 minutes ago Up 11 minutes determined_bose
6054880e6b1f python:3.11 "bash" 23 hours ago Up 23 hours mystifying_volhard
利用が終了したら、コンテナを停止
- python3.11環境の停止(引数にはCONTAINER IDかNAMESを入力)
(例)
docker stop 23ac76e099f5
- python3.12環境の停止(引数にはCONTAINER IDかNAMESを入力)
(例)
docker stop 6054880e6b1f
停止中コンテナの起動
停止中のコンテナも含め、プロセスを確認します(docekr ps -a)。
各コンテナのCONTAINER IDかNAMESを確認します。
docker ps -a
# 実行結果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
23ac76e099f5 python:3.12 "bash" 13 minutes ago Exited (137) 3 minutes ago determined_bose
6054880e6b1f python:3.11 "bash" 23 hours ago Exited (137) About a minute ago mystifying_volhard
- 停止中コンテナの起動
python3.11環境の起動(引数にはCONTAINER IDかNAMESを入力)
(例)
docker start -ai 23ac76e099f5
python3.12環境の起動(引数にはCONTAINER IDかNAMESを入力)
(例)
docker start -ai 6054880e6b1f
これでまたいつでも異なるPythonのバージョンのコンテナが利用できます。
Dockerを体系的に学びたい方
Dockerの入門の講座をUdemyで公開しました。
記事よりも細かく説明を聞きたい方、体系的に一通り学びたい方向けに3時間程度の講義で入門レベルをギュッとまとめています。
Dockerの起動方法やDockerfileの作り方、Docker Composeの実行方法など一通り詰まっています。
ハンズオンで手を動かしてしっかり学べるように構成しています。
とりあえず一回触ってみたい方、これから現場にDockerの導入を検討の方はぜひ!
Discussion