以前の記事、「"Create a Dockerfile for Flask Application"」では、FlaskアプリケーションをDockerを使ってコンテナ化する方法を説明しました。

この記事では、PostgreSQLデータベースをSQLAlchemyと統合し、Flaskアプリケーションとデータベースの両方をDockerとDocker Composeを使用してコンテナ化する方法を示します。このチュートリアルでは、軽量であるためpython:3.10-slimをベースイメージとして使用します。

ステップ1:FlaskのDockerfile

更新されたDockerfileは次のとおりです。

# 公式のPythonランタイムをベースイメージとして使用
FROM python:3.10-slim

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

# Pythonの依存関係をインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

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

# アプリケーションポートを公開
EXPOSE 5000

# Flaskアプリを起動するコマンド
CMD ["python", "app.py"]

ステップ2:Docker Composeの設定

FlaskとPostgreSQLの両方を管理するための更新されたdocker-compose.ymlファイルです。

version: '3.8'

services:
  web:
    build:
      context: .
    container_name: flask_app
    ports:
      - "5000:5000"
    volumes:
      - .:/app
    environment:
      - SQLALCHEMY_DATABASE_URI=postgresql://glinteco:glinteco@db:5432/glinteco
    depends_on:
      - db

  db:
    image: postgres:13
    container_name: postgres_db
    environment:
      POSTGRES_USER: glinteco
      POSTGRES_PASSWORD: glinteco
      POSTGRES_DB: glinteco
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

ステップ3:SQLAlchemyのためのFlaskアプリケーションの更新

PostgreSQLデータベースを使用するように設定されたFlaskアプリケーション(app.py)の例を次に示します。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# データベースの設定
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://glinteco:glinteco@db:5432/glinteco'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

# シンプルなモデルを定義
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)

@app.route('/')
def index():
    return "Hello, Flask with PostgreSQL!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

ステップ4:コンテナの構築と実行

Dockerイメージの構築:

docker-compose build

コンテナの起動:

docker-compose up
docker-compose up -d  # デーモンとして実行

設定の検証:

http://localhost:5000でFlaskアプリケーションにアクセスします。

PostgreSQLは、ユーザー名、パスワード、データベース名がglintecoとしてlocalhost:5432で実行されます。

この設定の主な利点

  • 統一された開発環境:FlaskとPostgreSQLはコンテナ内でシームレスに実行され、一貫性を確保します。
     
  • カスタマイズ可能なデータベース設定:ユーザー名、パスワード、データベース名は設定で簡単に更新できます。
     
  • 簡素化された統合:SQLAlchemyは、データベースとのやり取りをクリーンで効率的な方法で提供します。

一般的なDockerエラーとその修正方法

エラー:「Dockerデーモンに接続できません」

これは、Dockerデーモンが実行されていないか、ユーザーにアクセス許可がない場合に発生します。これを解決するには、sudo systemctl start dockerコマンドでDockerデーモンが実行されていることを確認します。また、sudo usermod -aG docker $USERを使用してユーザーをDockerグループに追加して、すべてのコマンドでsudoを使用するのを避けることができます。その後、システムを再起動するか、ログアウトして再度ログインして、グループの変更を適用します。

エラー:「イメージが見つかりません」

これは、指定されたDockerイメージがローカルまたはDocker Hubリポジトリに存在しない場合に発生します。これを修正するには、イメージ名とバージョンを再確認し、docker pull < image_name >:< tag >でプルします。イメージ名が不明な場合は、docker search < image_name >を使用して正しいものを探します。

エラー:「ポートは既に使用されています」

コンテナまたは別のアプリケーションが既に指定されたポートを使用している場合は、sudo lsof -i :< port >コマンドを使用して競合するプロセスを特定します。そのプロセスを停止するか、Dockerの実行コマンドまたはdocker-compose.ymlで別のポートを指定します。

エラー:ファイルへのアクセス時に「アクセス拒否」

このエラーは、コンテナがホスト上のファイルまたはディレクトリにアクセスする権限がない場合に発生します。chmod 777 < file_or_directory >で正しい権限を確認します。SELinuxを使用するシステムでは、ボリュームをマウントする際に:zまたは:Zオプションを使用して、適切なアクセスを許可します(例:volumes: - /host/path:/container/path:Z)。

エラー:「コンテナはコード1で終了しました」

このエラーは、コンテナ内のアプリケーションで問題が発生し、終了したことを示しています。docker logs を使用して、詳細をコンテナログで確認します。アプリケーションの設定、依存関係、またはエントリポイントを確認して、問題を解決します。

エラー:「メモリ不足」または「メモリを割り当てることができません」

Dockerまたはホストシステムに十分なメモリがありません。docker-compose.ymlでmem_limit: 512mを使用して、コンテナのメモリ使用量を制限します。または、システムメモリを解放するか、ホストシステムにスワップスペースを追加します。

エラー:MacまたはWindowsで「マウント拒否:許可されたディレクトリの外部のパス」

Docker Desktopは特定のディレクトリへのアクセスを制限しています。これを修正するには、Docker Desktopの設定で共有フォルダーリストにディレクトリを追加するか、ユーザーディレクトリ内など、許可されたパス内のディレクトリを使用します。

エラー:「デバイス上に空き容量がありません」

これは、Dockerが使用可能なディスク容量をすべて消費した場合に発生します。docker system prune -aを使用して、使用されていないイメージ、コンテナ、ボリュームを削除します。また、docker system dfを使用して大きなDockerファイルを調べ、それに応じてクリーンアップすることもできます。

エラー:「ネットワークが見つかりません」

これは、指定されたDockerネットワークが存在しない場合に発生します。docker network lsを使用して既存のネットワークをリストし、必要に応じてdocker network create < network_name >でネットワークを作成します。

エラー:「競合:ボリュームを削除できません」

ボリュームがコンテナによってまだ使用されている可能性があります。これを修正するには、docker stop とdocker rm < container_name >を使用して、ボリュームを使用しているコンテナを停止して削除します。次に、docker volume rm でボリュームを削除します。

エラー:「ビルド失敗:無効な参照形式」

このエラーは、Dockerfileまたはコマンドのイメージ名またはタグが無効な場合に発生します。形式が/:に従っていること、特殊文字やスペースがないことを確認します。

エラー:「Docker Composeのバージョンが一致しません」

これは、Docker ComposeファイルのバージョンがインストールされているComposeのバージョンと互換性がない場合に発生します。docker-compose --versionを使用してDocker Composeのバージョンを確認し、docker-compose.ymlファイルで互換性のあるバージョンを使用するか、Docker Composeを新しいバージョンに更新します。

結論

このガイドに従うことで、FlaskアプリケーションとPostgreSQLデータベースをDockerとDocker Composeを使用してコンテナ化できます。この設定により、開発と展開のためのスケーラブルで一貫性のある環境が確保されます。まだの場合は、FlaskアプリケーションのDocker化についてより深く理解するために、以前の記事を再確認してください。