IT・WEB・ゲーム業界の転職に強いR-Stone

転職コラム

DockerでPython環境を構築する方法は?初心者向けに手順と活用例を解説

「自分のパソコンでは動くのに、他の環境では動かない」など、開発の悩みを解決するのがDockerです。

Dockerを使えば、OSやライブラリのバージョンを含めた完全な開発環境をコンテナとして管理できるため、どの環境でも同じように動作します。

本記事では、Dockerの基本概念から、Python開発での具体的なメリット、そしてFlaskとMySQLを使った実践的な環境構築までを初心者にもわかりやすく解説します。

Dockerとは?

Dockerは、アプリケーションを軽量な仮想環境(「コンテナ」)で管理する技術です。

「イメージ」はひな形、「コンテナ」は実際に動く実体です。

開発環境の統一や本番環境へのデプロイなどに使われます。

仮想環境(venv, Anaconda)との違い

仮想環境はパッケージのみを隔離しますが、DockerはOSやDBサーバーなども仮想化します。

例えば、会社はWindows、自宅でmacOSを使っていても両者を同じ動作環境で開発できます。

Python開発にDockerを使うメリット

Python開発にDockerを活用するメリットを見ていきましょう。

環境構築の再現性が高い

Dockerfileに環境設定を書くと、誰でも同じ開発環境を作れます。

チーム全員が同じ環境で開発できます。

ローカル汚さずに開発が可能

コンテナ内で開発するため、自分のパソコンにライブラリを直接入れる必要がありません。

チーム開発やCI/CDにも便利

Docker Composeを使うと、複数のサービスを組み合わせた開発環境を簡単に構築できます。

GitHubやGitLabにコードをプッシュした際に、自動的にコンテナ内でテストなどを実行できます。

事前準備とインストール

今回は、FlaskとMySQL開発を題材に、構築をおこないます。

Docker Desktopのインストール

Docker Desktop公式サイトからインストーラーを取得し、実行します。

# インストール完了後、ターミナルを開き、下記コマンドでバージョンが表示されることを確認します。

docker –version

docker compose –version

作成するアプリケーションの概要

FlaskとMySQLを使用した、簡易掲示板です。

ディレクトリの準備

以下のディレクトリ構造を作成します。

現段階ではファイルは空です。

以下、適切なディレクトリでファイルを編集してください。

Dockerfileの作成方法

Dockerfileで、コンテナを定義してみましょう。

基本的なDockerfileの書き方

Pythonのコンテナは、以下のように記載できます。

FROM python:3.13-slim

 

WORKDIR /app

COPY app/ ./

RUN pip install –no-cache-dir -r requirements.txt

EXPOSE 5000

 

CMD [“python”, “app.py”]

requirements.txtの作成方法

Pythonプロジェクトで使うパッケージを記載します。

Flask==2.3.3

mysql-connector-python==8.1.0

requests==2.31.0

パッケージ名のあとに==でバージョンを固定すると、環境間での動作の一貫性を保てます。

Composeファイルの作成

docker-compose.ymlは、複数のコンテナを組み合わせたアプリケーションを定義するファイルです。

WEBアプリケーションとデータベースのように分けて管理できます。

services:

  web:

    build: .

    restart: always

    depends_on:

       db

    environment:

      MYSQL_DATABASE: flask_db

      MYSQL_USER: user

      MYSQL_PASSWORD: r-stone

    ports:

       “5000:5000”

    volumes:

       ./app:/app

  db:

    image: mysql:8.4

    restart: always

    environment:

      MYSQL_ROOT_PASSWORD: example

      MYSQL_DATABASE: flask_db

      MYSQL_USER: user

      MYSQL_PASSWORD: r-stone

    ports:

       “3306:3306”

 

Dockerを使った開発の実践

アプリケーションのコードを作成します。

アプリケーション本体

メインのアプリケーションapp.pyです。

from flask import Flask, render_template, request, redirect, url_for

from mysql.connector import connect, Error

import os, time

 

app = Flask(__name__)

 

def get_db_connection(retries=5, delay=3):

    for i in range(retries):    # 何度かトライする

        try:

            return connect(

                host=‘db’,

                database=os.getenv(‘MYSQL_DATABASE’),

                user=os.getenv(‘MYSQL_USER’),

                password= os.getenv(‘MYSQL_PASSWORD’),

                time_zone=‘+09:00’

            )

        except Error as e:

            print(f”[{i+1}/{retries}] DB接続エラー: {e}{delay}秒後に再試行”)

            time.sleep(delay)

    print(“DB接続に失敗しました。”)

 

def db_execute(sql, select=False, params=None):

    “””SQL実行する共通関数。select=True の場合はリストを返す。”””

    conn = get_db_connection()

    if not conn:

        return None

 

    with conn.cursor() as cur:

        try:

            cur.execute(sql, params or ())

            return cur.fetchall() if select else conn.commit()

        except Exception as e:

            print(f”DBエラー: {e})

        finally:

            conn.close()

 

@app.route(‘/’)

def index():    # メインページ

    sql = ‘SELECT content, created_at FROM posts ORDER BY created_at DESC’

    posts = db_execute(sql, select=True) or []

    return render_template(‘index.html’, posts=posts)

 

@app.route(‘/post’, methods=[‘POST’])

def add_post(): # 投稿用URL

    content = request.form.get(‘content’, ).strip()

    if content:

        sql = ‘INSERT INTO posts (content) VALUES (%s)’

        db_execute(sql, params=(content,))

    return redirect(url_for(‘index’))

 

def init_posts_table(): # テーブル初期化

    sql = “””

    CREATE TABLE IF NOT EXISTS posts (

        id INT AUTO_INCREMENT PRIMARY KEY,

        content TEXT NOT NULL,

        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

    )

    “””

    db_execute(sql)

 

if __name__ == ‘__main__’:

    init_posts_table()

    app.run(host=‘0.0.0.0’, port=5000, debug=True)

テンプレート

デザインをtemplates/index.htmlに作成します。

<!DOCTYPE html>

<html lang=“ja”>

<head>

    <meta charset=“UTF-8”>

    <meta name=“viewport” content=“width=device-width, initial-scale=1.0”>

    <title>掲示板</title>

    <style>

        body { margin: 20px; } .ta { width: 100%; height: 5em;}

        .post { border: 1px solid #ddd;  }

        .date { color: #666; font-size: 0.8em; }

        .bt  {background: #2c3; color: #fff; border:none;}

        .ta, .post, .bt { padding: 8px; margin: 8px 0;}

    </style>

</head>

<body>

    <h1>Flask掲示板</h1>

    <form method=“POST” action=“/post”>

        <textarea name=“content” required class=“ta”></textarea>

        <button type=“submit” class=“bt”>投稿する</button>

    </form>

    <h2>投稿一覧</h2>

    {% for post in posts %}

    <div class=“post”>

        <p>{{ post[0] }}</p>

        <div class=“date”>{{ post[1] }}</div>

    </div>

    {% else %}

    <p>まだ投稿していません。</p>

    {% endfor %}

</body>

</html>

動作確認

アプリケーションを起動します。

# プロジェクトディレクトリをカレントに

cd flask-board

# コンテナをビルドして起動

docker-compose up –build

 

# デバッグなどで必要な場合、以下のコマンドでコンテナにアクセスします。

 

# Flaskコンテナに接続(使用後は exit コマンドで接続終了)

docker exec -it flask-board-web-1 /bin/bash

 

# MySQLコンテナに接続(使用後は exit; で接続終了)

docker exec -it flask-board-db-1 mysql -u root -p

# パスワードは example

コンテナの削除方法

開発後は、コンテナとリソースを削除します。

# コンテナを停止して削除(ボリュームも削除)

docker-compose down -v

 

# イメージも含めて完全に削除

docker-compose down -v –rmi all

まとめ

DockerでPython環境を構築すると、自分のPCでは動き、別のPCで動かないトラブルから解放されます。OSレベルで環境を隔離できるため、チーム開発や複雑なシステム連携も容易になります。

本記事を参考に、あなたのプロジェクトにもDockerを導入してみませんか?