【ConoHa WING】今ならWINGパックが最大55%OFF + 独自ドメインも2つ無料でもらえます! ※期間限定なのでお早めに

【備忘録】Docker-composeでOracle Free環境を構築し、Flask-SQLAlchemyから接続する手順

Oracle

この記事では、Oracle Database Free(Oracle 23c Free)Flask を使ったマルチコンテナ環境をDocker Composeで構築する手順を紹介します。必要な技術知識は以下の通り。

  1. Docker / Docker Compose
    • 複数のコンテナを管理するためのツール。
    • コンテナ化技術を使って環境を簡単にセットアップ・管理します。
  2. Oracle Database Free
    • Oracleが提供する無償のデータベース。PDB(Pluggable Database)に対応し、学習や小規模なアプリケーションに最適です。
  3. Flask
    • Python製の軽量なWebフレームワーク。
    • REST APIを作成し、データベースと接続するシンプルなアプリケーションを構築します。
  4. python-oracledb
    • Oracle Database接続用の公式Pythonドライバ。従来のcx_Oracleの後継として提供され、軽量かつ高機能です。

この記事で学べること

  • Oracle Database FreeとFlaskアプリケーションの連携方法
  • Docker Composeを用いたマルチコンテナ環境の構築手順
  • 最新のpython-oracledbドライバを利用したOracle接続
目次

プロジェクトのディレクトリ構成

project/
├── docker-compose.yml
├── flask_app/
│   ├── Dockerfile
│   ├── app.py
│   └── requirements.txt

docker-compose.yml

Docker Composeを使って複数のコンテナを一括で管理・起動するための設定ファイルです。アプリケーション全体の基盤となります。

version: '3.8'

services:
  oracle-free:
    image: container-registry.oracle.com/database/free:latest
    container_name: oracle-free
    ports:
      - "1521:1521"
      - "5500:5500"
    environment:
      ORACLE_PWD: "oracle"
    volumes:
      - oracle-data:/opt/oracle/oradata
    restart: always

  flask-app:
    build: ./flask_app
    container_name: flask-app
    ports:
      - "5000:5000"
    depends_on:
      - oracle-free
    environment:
      DATABASE_USERNAME: "system"
      DATABASE_PASSWORD: "oracle"
      DATABASE_HOST: "oracle-free"
      DATABASE_PORT: "1521"
      DATABASE_SERVICE: "FREEPDB1"

volumes:
  oracle-data:
    driver: local
  • oracle-freeサービス: Oracle Database Freeを起動し、永続化ボリュームを設定。ポートをホスト側にマッピング。
  • flask-appサービス: Flaskアプリケーションを起動し、Oracle Database Freeに接続するよう設定。
  • 依存関係管理: depends_onにより、Oracle Databaseが先に起動することを保証しています。

Dockerfile

Flaskアプリケーションをコンテナ化するための設定ファイルです。Python環境の構築やアプリケーションコードの配置を行います。

FROM python:3.10

WORKDIR /app

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

COPY app.py .

CMD ["python", "app.py"]
  • Python公式イメージ: ベースとしてpython:3.10を使用。
  • 依存ライブラリのインストール: requirements.txtを読み込み、必要なPythonパッケージをインストール。
  • アプリケーションの起動: app.pyを実行し、Flaskサーバーを起動。

Flaskアプリケーションの設定

requirements.txt

Flaskアプリケーションが動作するために必要なPythonライブラリの依存関係をリスト化しています。

flask
flask-sqlalchemy
oracledb
  • Flask: 軽量なWebフレームワーク。APIエンドポイントを提供します。
  • Flask-SQLAlchemy: データベースORM(Object Relational Mapper)を使用するためのライブラリ。
  • oracledb: Oracle Databaseに接続するためのPython公式ドライバ。

app.py

Flaskを使用してAPIを提供するアプリケーションコードです。Oracle Database Freeに接続し、データの取得を行います。

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
import os

app = Flask(__name__)

# Oracle Database接続設定
DATABASE_USERNAME = os.getenv("DATABASE_USERNAME", "system")
DATABASE_PASSWORD = os.getenv("DATABASE_PASSWORD", "oracle")
DATABASE_HOST = os.getenv("DATABASE_HOST", "oracle-free")
DATABASE_PORT = os.getenv("DATABASE_PORT", "1521")
DATABASE_SERVICE = os.getenv("DATABASE_SERVICE", "FREEPDB1")

app.config['SQLALCHEMY_DATABASE_URI'] = (
    f"oracle+oracledb://{DATABASE_USERNAME}:{DATABASE_PASSWORD}"
    f"@{DATABASE_HOST}:{DATABASE_PORT}/?service_name={DATABASE_SERVICE}"
)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

# モデル定義
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)

    def to_dict(self):
        return {"id": self.id, "name": self.name}

@app.route('/')
def index():
    return jsonify({"message": "Welcome to Oracle Free Flask API"})

@app.route('/users')
def get_users():
    users = User.query.all()
    return jsonify([user.to_dict() for user in users])

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)
  • 環境変数の取得: データベース接続情報(ユーザー名、パスワード、ホスト名など)を環境変数から取得。
  • データベース接続設定: SQLAlchemyを利用してOracle Databaseに接続。
  • データモデルの定義: UserテーブルをORMでモデル化。
  • APIエンドポイント:
    • / ルート: APIが動作しているかを確認するメッセージを返却。
    • /users: データベースからユーザー情報を取得し、JSON形式で返却。

コンテナの起動と確認

  1. Docker Composeでコンテナをビルドし、起動します。
docker-compose up -d --build

Oracle Databaseの初期設定

コンテナ内に入ります。

docker exec -it oracle-free bash

SQL*Plusで接続します。

sqlplus system/oracle@FREEPDB1

テーブルを作成し、データを挿入します。

CREATE TABLE users (
    id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    name VARCHAR2(50) NOT NULL
);

INSERT INTO users (name) VALUES ('Alice');
INSERT INTO users (name) VALUES ('Bob');

COMMIT;

Flaskアプリケーションから動作を確認

ブラウザで以下のURLにアクセスし、動作を確認します。

アプリケーションのルート: http://localhost:5000/

http://localhost:5000/の結果

ユーザー一覧: http://localhost:5000/users

http://localhost:5000/usersの結果

記事のまとめ

本記事では、Oracle Database FreeFlaskアプリケーションをDocker Composeでマルチコンテナとして構築する手順を説明しました。

  1. Oracle Freeのセットアップ
    Docker公式イメージを使用して、データベースをコンテナ化し、管理者ユーザーで初期テーブルを作成しました。
  2. Flaskアプリケーションの作成
    PythonのFlaskSQLAlchemyを利用し、Oracle Freeに接続するシンプルなAPIを作成しました。接続には最新のpython-oracledbドライバを使用しています。
  3. Docker Composeによる統合
    Docker Composeを使って、Oracle FreeとFlaskアプリケーションを一括で起動し、コンテナ間の通信を確立しました。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次