この記事では、Oracle Database Free(Oracle 23c Free) と Flask を使ったマルチコンテナ環境をDocker Composeで構築する手順を紹介します。必要な技術知識は以下の通り。
- Docker / Docker Compose
- 複数のコンテナを管理するためのツール。
- コンテナ化技術を使って環境を簡単にセットアップ・管理します。
- Oracle Database Free
- Oracleが提供する無償のデータベース。PDB(Pluggable Database)に対応し、学習や小規模なアプリケーションに最適です。
- Flask
- Python製の軽量なWebフレームワーク。
- REST APIを作成し、データベースと接続するシンプルなアプリケーションを構築します。
- python-oracledb
- Oracle Database接続用の公式Pythonドライバ。従来の
cx_Oracle
の後継として提供され、軽量かつ高機能です。
- Oracle Database接続用の公式Pythonドライバ。従来の
この記事で学べること
- 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形式で返却。
コンテナの起動と確認
- 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/users
記事のまとめ
本記事では、Oracle Database FreeとFlaskアプリケーションをDocker Composeでマルチコンテナとして構築する手順を説明しました。
- Oracle Freeのセットアップ
Docker公式イメージを使用して、データベースをコンテナ化し、管理者ユーザーで初期テーブルを作成しました。 - Flaskアプリケーションの作成
PythonのFlaskとSQLAlchemyを利用し、Oracle Freeに接続するシンプルなAPIを作成しました。接続には最新のpython-oracledbドライバを使用しています。 - Docker Composeによる統合
Docker Composeを使って、Oracle FreeとFlaskアプリケーションを一括で起動し、コンテナ間の通信を確立しました。