Docker

PythonのDockerイメージでPythonプログラムを実行してみた

Docker公式のDockerレジストリ「Docker Hub」には、さまざまなDockerイメージが格納されている。

今回は、PythonのDockerイメージを利用して、PythonライブラリをインストールしPythonプログラムを実行してみたので、その手順を共有する。

今回利用するDockerイメージ「pyhon」は、以下の場所に格納されている。今回は「24.10」タグを利用する。
https://hub.docker.com/_/python

DockerPythonイメージ_1 DockerPythonイメージ_2

前提条件

以下の手順に従って、Windows端末上に、Docker Desktopをインストール済であること。

Windows端末上に「Docker Desktop」をインストールしてみた「Docker Desktop」とは、ローカル環境にDockerコンテナを用いた開発環境を導入するためのソフトウェアのことをいう。今回は...



Dockerコンテナ上でのPythonプログラムの実行

Pythonを含むDockerコンテナを起動し、DockerコンテナにログインしPythonプログラムを実行できるようにする。その手順は、以下の通り。

1) 以下のように、特定のフォルダ内に「Dockerfile」、インストールするPythonライブラリ「requirements.txt」、実行するPythonプログラム「decision_tree_sample.py」を配置する。
Python Dockerコンテナ上でのPythonプログラムの実行_1_1

それぞれのファイルの中身は以下の通りで、decision_tree_sample.pyは、Linuxサーバ上で動かせるよう、文字コードをUTF-8・改行コードをLFとしている。

# 元となるイメージ名を指定
# バージョンを固定するため、タグ(3.12.4)を指定
FROM python:3.12.4

# 作業ディレクトリを作成し固定
RUN mkdir /usr/local/python
WORKDIR /usr/local/python

# ローカルのファイルを、作業ディレクトリ下にコピー
COPY requirements.txt .
COPY decision_tree_sample.py .

# python環境を構築するためのコマンドを実行
RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools

# pythonのライブラリをインストール
RUN python -m pip install jupyterlab
RUN python -m pip install -r requirements.txt

# 環境変数を設定
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
scikit-learn==1.5.1
numpy==2.0.0
pandas==2.2.2
matplotlib==3.9.1
Python Dockerコンテナ上でのPythonプログラムの実行_1_2
import numpy as np
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import sklearn.tree

# 実行時に使用する定数を定義
# MAX_DEPTH=2の場合、FIGSIZE_X=9、FIGSIZE_Y=6を指定
# MAX_DEPTH=3の場合、FIGSIZE_X=12、FIGSIZE_Y=8を指定
# MAX_DEPTH=4の場合、FIGSIZE_X=15、FIGSIZE_Y=10を指定
MAX_DEPTH = 4
FIGSIZE_X = 15
FIGSIZE_Y = 10

# アヤメのデータセットのデータを取得
iris = load_iris()

# 先頭51~55件目のデータ(versicolor)と、先頭101~105件目のデータ(virginica)の
# データを結合し、Xに格納
X = np.append(iris.data[50:100], iris.data[100:150], axis=0)

# 先頭51~55件目の結果(versicolor)と、先頭101~105件目の結果(virginica)の
# データを結合し、yに格納
y = np.append(iris.target[50:100], iris.target[100:150], axis=0)
print("*** 先頭51~55件目の結果 ***")
print(iris.target[50:55])
print("*** 先頭101~105件目の結果 ***")
print(iris.target[100:105])
print()

# scikit-learnのDecisionTreeClassifierに適用
dtc = DecisionTreeClassifier(max_depth=MAX_DEPTH, random_state=0)
dtc.fit(X, y)

# DecisionTreeClassifierによる算出結果
print("*** petal length(cm), petal width(cm)のみ抽出したデータからの判定 ***")
print("*** 先頭51~55件目のデータから判定した結果 ***")
print(dtc.predict(iris.data[50:55]))
print("*** 先頭101~105件目のデータから判定した結果 ***")
print(dtc.predict(iris.data[100:105]))

# 決定木を可視化
# 画像の表示サイズを変更
plt.figure(figsize=(FIGSIZE_X, FIGSIZE_Y))
# 第1引数:モデル名、第2引数:クラス名、第3引数:色付きで表示するか
sklearn.tree.plot_tree(dtc, class_names=['versicolor', 'virginica'], filled=True)
# 可視化したグラフを画像「decision_tree_graph.png」に保存
plt.savefig("decision_tree_graph.png")

なお、Dockerfileの記載は、以下のページを参考にしている。
https://toukei-lab.com/docker_python

2) コマンドプロンプトを起動し、「Dockerfile」が入っているフォルダに移動後、「docker build -t (Dockerイメージ名) (Dockerfileのパス)」コマンドを実行し、Dockerfileに従ったDockerイメージを作成する。
Python Dockerコンテナ上でのPythonプログラムの実行_2_1

なお、1回目に「docker build -t (Dockerイメージ名) (Dockerfileのパス)」コマンドを実行した場合の表示は、以下の通りで、少し時間がかかっていた。
Python Dockerコンテナ上でのPythonプログラムの実行_2_2

3)「docker image ls」コマンドで、2)で作成されたDockerイメージを確認する。
Python Dockerコンテナ上でのPythonプログラムの実行_3_1

Docker Desktop上でも、以下のように、2)で作成されたDockerイメージが確認できる。
Python Dockerコンテナ上でのPythonプログラムの実行_3_2

4)「docker container run -it -d (Dockerイメージ名)」を実行し、Dockerコンテナを作成・起動する。
Python Dockerコンテナ上でのPythonプログラムの実行_4

なお、オプション「-it」で、コンテナがすぐに終了しないようにし、オプション「-d」で、コンテナをバックグラウンドで起動するようにしている。

5)「docker container ls」コマンドで、4)で起動したDockerコンテナが作成され、起動していることが確認できる。
Python Dockerコンテナ上でのPythonプログラムの実行_5_1

Docker Desktop上でも、以下のように、4)で起動したDockerコンテナが作成され、起動していることが確認できる。
Python Dockerコンテナ上でのPythonプログラムの実行_5_2

6)「docker exec -it (コンテナID) /bin/bash」を実行すると、以下のように、4)で起動したDockerコンテナにログインすることができる。
Python Dockerコンテナ上でのPythonプログラムの実行_6

7) 4)で起動したDockerコンテナ内で、Pythonプログラム「decision_tree_sample.py」を実行すると、プログラムが正常終了し、画像ファイル「decision_tree_graph.png」が出力されることが確認できる。
Python Dockerコンテナ上でのPythonプログラムの実行_7

8) exitコマンドを実行すると、以下のように、4)で起動したDockerコンテナからログアウトできる。
Python Dockerコンテナ上でのPythonプログラムの実行_8

9)「docker cp (コンテナID):(取得したいファイルパス) (コピー先ディレクトリ)」コマンドを実行すると、以下のように、4)で起動したDockerコンテナ上のファイルを、ローカルに取得できる。
Python Dockerコンテナ上でのPythonプログラムの実行_9_1

ローカルにコピーされたファイルの中身は、以下の通り。
Python Dockerコンテナ上でのPythonプログラムの実行_9_2

Python Dockerコンテナ上でのPythonプログラムの実行_9_3

10)「docker container stop (コンテナID)」コマンドを実行すると、以下のように、4)で起動したDockerコンテナが停止することが確認できる。
Python Dockerコンテナ上でのPythonプログラムの実行_10_1

Docker Desktop上でも、以下のように、4)で起動したDockerコンテナの停止が確認できる。
Python Dockerコンテナ上でのPythonプログラムの実行_10_2

11)「docker container start (コンテナID)」コマンドを実行すると、以下のように、Dockerコンテナが起動することが確認できる。
Python Dockerコンテナ上でのPythonプログラムの実行_11_1

なお、既に存在するDockerコンテナを起動するには、docker container runコマンドでなく、docker container startコマンドを実行する。

Docker Desktop上でも、以下のように、Dockerコンテナの起動が確認できる。
Python Dockerコンテナ上でのPythonプログラムの実行_11_2

12)「docker exec -it (コンテナID) /bin/bash」を実行すると、先ほどと同様に、11)で起動したDockerコンテナにログインすることができる。
Python Dockerコンテナ上でのPythonプログラムの実行_12

要点まとめ

  • Docker公式のDockerレジストリ「Docker Hub」には、さまざまなDockerイメージが格納されていて、Pythonをインストール済のDockerイメージも利用することができる。