🐳

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の導入を検討の方はぜひ!

https://www.udemy.com/course/dockerwindowspc/?referralCode=6EDF0B9CB44057ACC299

Discussion