[Docker] DockerでPythonの実行環境を構築する

2023/1/27

Docker
Python

DockerでPythonの実行環境を構築したのでまとめてみました。
Dockerについていまいち理解していないが、とりあえずPythonの実行環境をローカル環境を汚さずにコンテナ技術を用いて準備したい方に向けた記事になります。

Dockerのインストール

自分のPC環境に適したDockerをインストールします。
今回は「Docker Desktop」を利用します。

https://www.docker.com/products/docker-desktop

「Docker Desktop」のインストールが完了したらターミナル等でdockerコマンドが使えることを確認しましょう。

001.png

Dockerの設定

ディレクトリ/ファイル構成

以下のような構成でディレクトリ/ファイルを作成してください
「python-sample-program」の部分は好きなのディレクトリ名に変えてください。

python-sample-program
├── Dockerfile
├── docker-compose.yml
└── opt
    └── sample.py

Dockerfile

Dockerfileに以下のように記述します。

# ベースイメージを選択
FROM python:3
USER root

# ベースイメージに対してコマンドを実行
RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
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

# 環境変数を設定
RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools

# モジュールをインストール

事前に使いたいモジュールが決まっている場合は以下のように追記します。
(例)「jupyterlab」モジュールを使う場合

RUN pip install jupyterlab

docker-compose.yml

docker-compose.ymlには以下のように記述します。

version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python3'
    working_dir: '/root/'
    tty: true
    volumes:
      - ./opt:/root/opt

sample.py

sample.pyには以下のように記述します。

def main():
    print('Hello World')

if __name__ == '__main__':
    main()

コンテナの起動

Dockerfileからイメージを作成し、そのイメージからコンテナを作成し起動します。
ターミナルに以下のコマンドを入力します。

docker compose up -d --build

今回はDockerコマンドの説明を省略しますが、コマンド一覧を丁寧にまとめている記事があるので紹介しておきます。

【チートシート】dockerコマンド一覧

コンテナに接続

コンテナに接続してコンテナの中の環境でコマンドを実行できるようにします。
ターミナルに以下のコマンドを入力します。

docker compose exec python3 bash

以下のような画面になっていれば接続が成功しています。

002.png

Pythonファイルの実行

コンテナ内でPythonファイルを実行します。

003.png

「Hello World」と表示されれば実行成功です。

コンテナの削除

コンテナとの接続を切り不要なコンテナを削除します。
ターミナルに以下のコマンドを入力します。

exit
docker compose down

以下のような画面になっていれば削除が成功しています。

004.png

コンテナの再作成

一度削除したコンテナを再作成し接続します。
ターミナルに以下のコマンドを入力します。

docker compose up -d

おわりに

今回はDockerでPythonの実行環境を構築しました。
Dockerでの開発環境構築は、ローカル環境に依存せず展開でき、ローカル環境を汚すこともないので非常に有益です。
筆者もさらに理解を深めたいと思います。