プログラミング

Step 2: PythonをDocker Composeで環境構築する方法(プログラミングの準備)

Step 2: PythonをDocker Composeで環境構築する方法(プログラミングの準備)

概要

フリーランスエンジニア スリーネクスト

プロフェッショナルなPython開発環境をDocker Composeで構築する完全ガイド。コンテナ技術の基本概念を図解し、Dockerfileによるイメージ作成、docker-compose.ymlでのサービス定義、Flaskアプリケーションの起動までをステップバイステップで解説します。

ポートやボリューム設定による効率的な開発手法も紹介し、誰でも同じ環境を再現できるモダンな開発スタイルを習得できます。

目次
「ゼロから始めるPython学習」各ステップのタイトル案
ゼロから始めるPython学習 STEP20目次

プログラミング未経験者向けPython入門講座。環境構築から変数、if文、for文、関数といった基本までを20のステップでわかりやすく解説します。自分のペースで一歩ずつ着実に学び、プログラミングの第一歩を踏み出しましょう!

続きを見る

はじめに

Pythonの冒険を始めるにあたり、前回は「Anaconda」を使って自分のPCに直接開発環境を整える方法を学びました。それは、自分の家に最高のキッチンを作るようなものでした。しかし、プロの開発現場や、よりクリーンで再現性の高い環境を求める場合、「コンテナ技術」という、さらにモダンで強力なアプローチが存在します。

このステップでは、そのコンテナ技術の主役である「Docker(ドッカー)」と、複数のコンテナを効率的に管理する「Docker Compose(ドッカー・コンポーズ)」を使って、Pythonのプログラミング環境を構築する方法を学びます。

一見すると複雑に聞こえるかもしれませんが、これは「どこにでも持ち運べる、完璧にセッティングされたカプセルキッチン」を手に入れるようなものです。この方法をマスターすれば、あなたの開発環境はPCのOSや設定に依存しなくなり、誰とでも、どんな場所でも、全く同じ環境を瞬時に再現できるようになります。さあ、未来の開発スタイルへの扉を開きましょう。


DockerとDocker Composeとは?:魔法の箱と設計図

まず、このモダンな環境構築の主役となる2つのツールの役割を、身近な例えで理解しましょう。

Docker: 隔離された魔法の箱「コンテナ」を作る技術

Dockerとは、「コンテナ」と呼ばれる、OSレベルの仮想化技術です。 ...と言っても難しいですね。簡単に言うと、アプリケーションとその実行に必要なもの(ライブラリ、設定ファイルなど)をすべて詰め込んだ、軽量で独立した箱を作るための技術です。

  • 従来のPC環境: あなたのPC(OS)という一つの大きな部屋に、Python、データベース、Webサーバーなど、様々な家具(ソフトウェア)を直接置いていくイメージです。家具同士が干渉したり(ライブラリのバージョン競合)、部屋(OS)を引っ越すときに家具の再設置が大変だったりします。
  • Dockerコンテナ: それぞれの家具を、専用の透明な箱に入れてから部屋に置くイメージです。Pythonの箱、データベースの箱、といった具合です。
    • 隔離性: 箱の中は外の世界から隔離されているため、お互いに干渉しません。Aの箱で使うPythonのバージョンが、Bの箱に影響することはありません。
    • 可搬性: この箱はDockerがインストールされているPCならどこにでも持っていくことができ、全く同じ状態で動きます。「私のPCでは動いたのに、あなたのPCでは動かない」という問題が劇的に減少します。
    • 軽量: 従来の仮想マシン(VMwareやVirtualBoxなど)がOSごと仮想化するのに対し、DockerコンテナはホストOSのカーネルを共有するため、非常に軽量で高速に起動・停止できます。

Docker Compose: 複数の箱を連携させる「設計図」

Webアプリケーションを開発する場合、通常は複数のソフトウェアが連携して動作します。例えば、「Pythonアプリケーション(Webサーバー)」と「データベース(PostgreSQLなど)」が必要です。

これをDockerで実現するには、PythonのコンテナとPostgreSQLのコンテナ、2つの箱をそれぞれ起動し、それらが通信できるようにネットワーク設定をする必要があります。この作業を毎回手動で行うのは大変です。

そこで登場するのがDocker Composeです。これは、複数のコンテナの構成や連携方法をdocker-compose.ymlという一つのファイル(設計図)に記述しておくことで、コマンド一発で全てのコンテナをまとめて起動・管理できるようにするツールです。

graph TD
    A["あなた (開発者)"] -- "docker-compose up コマンド実行" --> B["docker-compose.yml (設計図)"];
    B -- "指示を出す" --> C["Docker Engine"];

    subgraph "C: Docker Engineがコンテナを構築・起動"
        D["Pythonアプリケーション用コンテナ"]
        E["データベース用コンテナ (PostgreSQLなど)"]
        F["コンテナ間のネットワーク"]
    end

    C --> D & E & F;
    D -- "データを保存・取得" <--> F;
    E -- "データを提供する" <--> F;

    A -- "ブラウザでアクセス" --> D;

この「設計図」さえ共有すれば、チームの誰もが同じ構成の環境を瞬時に手元で再現できるのです。


なぜDocker Composeを使うのか?:現代開発の常識

Anacondaと比べて少し手順は増えますが、それでもなお多くの開発現場でDockerが採用されるのには、明確なメリットがあるからです。

  1. 環境の完全な再現性: docker-compose.ymlファイルがあれば、Windows、macOS、Linuxを問わず、誰のPCでも全く同じ環境を再現できます。これにより、「開発者Aの環境では動くけど、Bの環境ではエラーになる」といった環境差異に起因する問題がなくなります。
  2. クリーンな開発環境: PC本体にはDockerをインストールするだけ。Python本体やライブラリ、データベースソフトなどを直接インストールする必要がないため、PCを汚しません。プロジェクトが終われば、コンテナとイメージを削除するだけで、環境を完全に消去できます。
  3. 本番環境との親和性: 開発環境で使ったDockerコンテナは、そのまま本番環境のサーバー(AWS, GCPなど)でも動かすことができます。開発と本番の環境を近づけることで、デプロイ時のトラブルを減らすことができます。
  4. プロジェクト管理の容易さ: プロジェクトに必要なソフトウェア構成がdocker-compose.ymlにコードとして記述されているため、新しいメンバーがチームに参加した際も、Dockerをインストールしてコマンドを一つ実行するだけで、すぐに開発を始められます。

Step 1: Docker Desktopのインストール

それでは、実際に環境構築を始めましょう。最初のステップは、DockerおよびDocker Composeを簡単に利用できるようにした公式アプリケーション「Docker Desktop」をインストールすることです。

  • Windows: Windows 10/11 64-bit: Home, Pro, Enterprise, Educationのいずれかが必要です。WSL 2 (Windows Subsystem for Linux 2) という機能の有効化が推奨されます。
  • macOS: IntelチップまたはAppleシリコン (M1/M2/M3) を搭載したMacに対応しています。

インストール手順

  1. 公式サイトからダウンロード: まずはDockerの公式サイトにアクセスし、お使いのOSに合ったDocker Desktopをダウンロードします。Docker公式サイト: https://www.docker.com/products/docker-desktop/
  2. インストーラーの実行: ダウンロードしたインストーラーを実行し、画面の指示に従ってインストールを進めます。
    • Windows: インストール中に「Use WSL 2 instead of Hyper-V (recommended)」というオプションが表示されたら、チェックを入れたまま進めてください。インストール完了後、PCの再起動を求められることがあります。
    • macOS: ダウンロードした.dmgファイルを開き、Dockerアイコンを「Applications」フォルダにドラッグ&ドロップします。初回起動時にパスワードを求められることがあります。
  3. Docker Desktopの起動と確認: インストールが完了したら、Docker Desktopを起動します。起動に成功すると、タスクバー(Windows)やメニューバー(macOS)にクジラのアイコン 🐋 が表示されます。
  4. 動作確認: ターミナル(Windowsの場合はPowerShellまたはコマンドプロンプト、macOSの場合はターミナル.app)を開き、以下の2つのコマンドをそれぞれ実行してみてください。Bashdocker --version docker-compose --version Docker version 2x.x.xDocker Compose version v2.x.xのように、それぞれのバージョン情報が表示されれば、インストールは正常に完了しています。

Step 2: プロジェクトの準備と設計図の作成

Dockerの準備が整ったので、次はPythonアプリケーションを動かすためのプロジェクトを作成し、その「設計図」となる各種設定ファイルを書いていきます。

今回は、シンプルなWebアプリケーションフレームワークである「Flask」を使った「Hello, Docker!」と表示するだけのWebサーバーを構築してみましょう。

プロジェクト構成

まず、PCの好きな場所(デスクトップやドキュメントなど)に、このプロジェクト用のフォルダをpython-docker-appという名前で作成してください。そして、そのフォルダの中に、以下の4つのファイルを作成します。

python-docker-app/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
└── app.py

それぞれのファイルが何をするためのものなのか、これから一つずつ詳しく見ていきましょう。


Step 3: 各ファイルの作成と解説

テキストエディタ(Visual Studio Codeなどがおすすめです)を使って、python-docker-appフォルダ内に4つのファイルを作成していきます。

1. app.py: Pythonアプリケーション本体

まずは、Webサーバーとして動作するPythonのコードです。Flaskを使って、アクセスすると「Hello, Docker!」というメッセージを返すだけのシンプルなプログラムです。

app.py

from flask import Flask

# Flaskアプリケーションのインスタンスを作成
app = Flask(__name__)

# '/'というURLにアクセスがあった場合の処理を定義
@app.route('/')
def hello():
    return 'Hello, Docker!'

# このファイルが直接実行された場合にサーバーを起動
if __name__ == '__main__':
    # host='0.0.0.0'は、コンテナの外部からアクセスできるようにするために必要
    app.run(host='0.0.0.0', port=5000, debug=True)

  • host='0.0.0.0'という指定が重要です。これにより、Dockerコンテナの外部、つまり私たちのPCのブラウザからアクセスできるようになります。
  • debug=Trueは開発モードを有効にするオプションで、コードを変更するとサーバーが自動で再起動するようになります。

2. requirements.txt: 必要なライブラリのリスト

次に、このPythonアプリケーションが必要とするライブラリをリストアップしたファイルを作成します。今回はFlaskだけなので、内容はシンプルです。

requirements.txt

Flask==2.3.2
  • ==に続けてバージョン番号を明記することで、誰が環境を構築しても必ず同じバージョンのライブラリがインストールされるようになり、再現性が高まります。

3. Dockerfile: コンテナの設計書(単体)

**Dockerfile**は、Dockerがコンテナの「イメージ」を作成するための手順書です。イメージとは、コンテナの元となるテンプレートやスナップショットのようなものです。料理に例えるなら、「生地」のレシピです。このレシピに従って、Dockerはコンテナという「パン」を焼き上げます。

graph TD
    A["Dockerfile (レシピ)"] -- "docker build コマンド" --> B["Docker Image (生地)"];
    B -- "docker run / docker-compose up コマンド" --> C["Docker Container (パン)"];

Dockerfile

# 1. ベースとなるイメージを指定
FROM python:3.10-slim

# 2. コンテナ内の作業ディレクトリを設定
WORKDIR /app

# 3. 必要なファイルをコンテナにコピー
COPY requirements.txt .

# 4. requirements.txtに記載されたライブラリをインストール
RUN pip install --no-cache-dir -r requirements.txt

# 5. アプリケーションコードをコンテナにコピー
COPY . .

# 6. コンテナ起動時に実行するコマンドを指定
CMD ["python", "app.py"]

この6行が何をしているのか、一行ずつ見ていきましょう。

  1. FROM python:3.10-slim: 「どのイメージを土台にしますか?」という宣言です。ここでは、Docker Hubという公開レジストリにある、Python 3.10がプリインストールされた軽量版(slim)の公式イメージをベースにします。
  2. WORKDIR /app: コンテナの中に/appという名前のフォルダを作り、今後の作業はすべてこの中で行いますよ、という宣言です。
  3. COPY requirements.txt .: ホストPC(あなたのPC)にあるrequirements.txtファイルを、コンテナ内のカレントディレクトリ(/app)にコピーします。
  4. RUN pip install --no-cache-dir -r requirements.txt: コンテナの中でpip installコマンドを実行し、requirements.txtに書かれたライブラリ(Flask)をインストールします。--no-cache-dirは不要なキャッシュを残さないおまじないです。
  5. COPY . .: ホストPCのカレントディレクトリにある全てのファイル(.はカレントディレクトリを意味します)を、コンテナ内のカレントディレクトリ(/app)にコピーします。これでapp.pyがコンテナ内に配置されます。
  6. CMD ["python", "app.py"]: このコンテナが起動したときに、デフォルトで実行されるコマンドを指定します。ここでは「python app.pyを実行してFlaskサーバーを起動しなさい」という命令になります。

4. docker-compose.yml: 連携するコンテナ群の設計図

いよいよ、Docker Composeの心臓部である**docker-compose.yml**を作成します。これは、複数のサービス(コンテナ)をどのように構成し、連携させるかを定義するファイルです。

docker-compose.yml

YAML

# Composeファイルのバージョンを指定
version: '3.8'

# サービス(起動するコンテナ)を定義
services:
  # 'app'という名前のサービスを定義
  app:
    # Dockerイメージのビルド方法を指定
    build: .
    # ポートのマッピングを設定
    ports:
      - "5000:5000"
    # ボリュームのマウントを設定
    volumes:
      - .:/app

このファイルも、各項目を詳しく見ていきましょう。

  • version: '3.8': 使用するDocker Composeのファイルフォーマットのバージョンです。'3.8'が一般的に使われます。
  • services:: ここから下に、起動したいコンテナの定義を複数記述していきます。
  • app:: サービスの名前です。自分で好きな名前を付けられます。ここではappとしました。
  • build: .: appサービスのイメージをビルドする方法を指定します。.はカレントディレクトリを指し、「このディレクトリにあるDockerfileを元にイメージをビルドしてください」という意味になります。
  • ports:: ホストPCとコンテナのポートを繋ぐ設定です。非常に重要です。
    • "5000:5000": これは「ホストPCの5000番ポートへのアクセスを、コンテナの5000番ポートに転送してください」という意味です。app.pyはコンテナ内の5000番ポートで待ち受けているので、この設定により、私たちのPCのブラウザからhttp://localhost:5000にアクセスできるようになります。
  • volumes:: ホストPCとコンテナのフォルダを同期させる設定です。これも開発効率を上げるために非常に重要です。
    • - .:/app: これは「ホストPCのカレントディレクトリ(.)を、コンテナの/appディレクトリにマウント(同期)してください」という意味です。これにより、ホストPC上でapp.pyを編集すると、それが即座にコンテナ内のapp.pyに反映されます。この設定がないと、コードを修正するたびにコンテナをビルドし直さなければならず、非常に手間がかかります。

Step 4: 環境の起動と動作確認

全ての設計図が完成しました!いよいよ、コマンド一つで魔法のカプセルキッチンを起動します。

環境のビルドと起動

  1. ターミナルを開き、cdコマンドで先ほど作成したpython-docker-appフォルダに移動します。Bash# 例: デスクトップに作成した場合 cd Desktop/python-docker-app
  2. そして、以下のマジックコマンドを実行します。Bashdocker-compose up --build
  • docker-compose up: docker-compose.ymlを読み込み、定義されたサービス(今回はappサービス)を起動するコマンドです。
  • --build: 起動前に、Dockerfileを元にイメージをビルド(再ビルド)するオプションです。初回起動時や、Dockerfileを編集した際には必ず付けましょう。

コマンドを実行すると、ターミナルにたくさんのログが流れます。FROM python:3.10-slimのダウンロードから始まり、Dockerfileに書かれた手順が一つずつ実行されていく様子がわかります。

最終的に、app.pyが実行され、以下のようなログが表示されてカーソルが止まれば成功です。

...
 * Running on http://127.0.0.1:5000
 * Running on http://172.19.0.2:5000
...

動作確認

  1. Webブラウザを開き、アドレスバーに http://localhost:5000 と入力してアクセスします。
  2. 画面に「Hello, Docker!」と表示されれば、あなたのDockerコンテナ上でPythonアプリケーションが正常に動作していることになります! 🎉

ライブリロードの確認

volumesの設定が正しく機能しているかも確認してみましょう。

  1. docker-compose upを実行したターミナルはそのままにしておきます。
  2. テキストエディタでapp.pyを開き、メッセージを'Hello, Docker Compose!'などに変更して保存します。
  3. ターミナルを見ると、Flaskのデバッグサーバーが変更を検知し、自動で再起動するログが流れているはずです。
  4. 再度ブラウザで http://localhost:5000 をリロード(再読み込み)してください。
  5. メッセージが変更後のものに変わっていれば、ライブリロードも成功です。これにより、非常に快適な開発サイクルが実現できます。

環境の停止

開発を終了する際は、docker-compose upを実行したターミナルで Ctrl + C を押します。すると、コンテナが停止します。

完全にコンテナを削除してクリーンな状態に戻したい場合は、同じディレクトリで以下のコマンドを実行します。

Bash

docker-compose down

これにより、作成されたコンテナとネットワークが削除されます。(volumesでマウントしたファイル自体はPC上に残るのでご安心ください)


まとめ

お疲れ様でした!このステップでは、現代的な開発手法であるDockerとDocker Composeを用いて、クリーンで再現性の高いPython開発環境を構築しました。

  • Dockerが提供する「コンテナ」という隔離された箱の概念を学びました。
  • Docker Composedocker-compose.ymlという「設計図」を用いて、複数のコンテナを協調動作させるツールであることを理解しました。
  • Dockerfile, docker-compose.yml, requirements.txt, app.pyという4つのファイルを実際に作成し、それぞれの役割を学びました。
  • docker-compose up --buildコマンド一つで、定義した環境をビルドし、起動できることを体験しました。
  • ポートマッピングによって外部からコンテナにアクセスし、ボリュームマウントによってコードのライブリロードを実現する方法を実践しました。

最初は覚えることが多くて大変に感じるかもしれませんが、このDocker Composeによる環境構築は、一度「設計図」を作ってしまえば、その恩恵は計り知れません。チーム開発、異なるプロジェクトの並行作業、そして本番環境へのデプロイまで、あらゆる場面であなたを助けてくれる強力な武器となります。

これで、どんな複雑なアプリケーションにも対応できる、プロフェッショナルな開発基盤が手に入りました。次のステップからは、この盤石な環境の上で、Pythonの文法という冒険の核心へと進んでいきましょう。

目次
「ゼロから始めるPython学習」各ステップのタイトル案
ゼロから始めるPython学習 STEP20目次

プログラミング未経験者向けPython入門講座。環境構築から変数、if文、for文、関数といった基本までを20のステップでわかりやすく解説します。自分のペースで一歩ずつ着実に学び、プログラミングの第一歩を踏み出しましょう!

続きを見る

-プログラミング