Traffine I/O

日本語

2022-06-14

Docker Composeを使用したFlaskとPostgreSQLのデプロイ

Docker Composeを使用してFlaskとPostgreSQLをデプロイ

この記事では、Docker Composeを使用して、PostgreSQLデータベースをバックエンドとしたFlask Webアプリケーションをデプロイする例を紹介します。

ディレクトリ構造は次のとおりです。

flask_app/
  ├── app/
  │   ├── __init__.py
  │   ├── main.py
  │   └── templates/
  │       └── index.html
  ├── Dockerfile
  ├── docker-compose.yml
  └── requirements.txt

コンテナの定義

  1. Flaskアプリケーションを作成(app/main.py)
app/main.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
  1. Flaskアプリケーションの基本的なテンプレートを作成(app/templates/index.html)
app/templates/index.html
<!DOCTYPE html>
<html>
<head>
  <title>Flask App with PostgreSQL</title>
</head>
<body>
  <h1>Welcome to our Flask app with PostgreSQL</h1>
</body>
</html>
  1. Flaskアプリケーション用のDockerfileを作成
Dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY app app

CMD ["python", "app/main.py"]
  1. 必要なPythonパッケージをrequirements.txtファイルに追加
requirements.txt
Flask==2.1.1
gunicorn==20.1.0
  1. FlaskアプリケーションとPostgreSQLサービスを定義するdocker-compose.ymlファイルを作成
docker-compose.yml
version: '3.9'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db
  db:
    image: postgres:13-alpine
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: flask_db
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

この例では、webdbの2つのサービスを定義しました。webサービスは、現在のディレクトリのDockerfileからビルドされるFlaskアプリケーションです。dbサービスは、公式のPostgreSQLイメージを使用し、ユーザー、パスワード、データベース名の環境変数が含まれています。また、PostgreSQLデータを永続化するために、名前付きボリューム(db_data)を作成しました。

コンテナの実行

このFlaskアプリケーションをPostgreSQLと一緒にデプロイするには以下を実行します。

  1. Dockerイメージをビルド
bash
$ docker-compose build
  1. サービスを起動してコンテナを作成
bash
$ docker-compose up -d

これで、Flaskアプリケーションにhttp://localhost:5000でアクセスできます。アプリケーションは、シンプルな「Welcome to our Flask app with PostgreSQL」というメッセージを表示します。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!