勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PodmanでPython用コンテナを作成しデータベース用コンテナに接続する方法

   2026/09/22  Podman サーバー Python

PodmanでPython用コンテナを作成しデータベース(MariaDB)用コンテナに接続させたい。Pythonは検証・テストで使用するだけなので、できるだけ小さめの構成かつメモリ割り当ても少くても済むようにコンテナを立てたい。以下に対応方法をメモ。

 

環境について

VPS

今回はKAGOYA CLOUD VPSのCPU1コア / メモリ1GBプランで作業した。SSH接続は公式案内の通り以下でログインできる。

  • 接続ポート -> 22
  • ユーザ名 -> root
  • パスワード or 秘密鍵 -> インスタンス作成時に選択したもの

ホスト(VPS)側

  • AlmaLinux 8.10 (Cerulean Leopard)

コンテナ側

  • podman version 4.9.4-rhel

 

対応方法

Dockerfile

# 軽量のPythonイメージ
FROM python:3.12-alpine

# 作業ディレクトリの設定
WORKDIR /app

# モジュールのインストール
RUN pip install --no-cache-dir pymysql

# 待機状態のままにする設定
CMD ["tail", "-f", "/dev/null"]

docker-compose.yml

ボリュームのホスト側パスは適宜変更。

services:
  python3.12-container:
    image: python3.12
    container_name: python-container
    volumes:
      - /path/to/python:/app:z
    deploy:
      resources:
        limits:
          memory: 96m
    networks:
      - web-db-net

networks:
  web-db-net:
    external: true

ビルドとコンテナ起動

サーバにSSH接続し、以下の通り進める。

# Dockerfileを設置したディレクトリに移動
cd /path/to

# ビルド
podman build -t python-container .

# コンテナ起動
podman compose up -d

(必要に応じて)テスト用データの用意

公式サイトのテスト用データベースをインポートしておく。今回はWorld databaseをインポートした。

実行するファイルの作成(test.py)

データベースに接続しcountry_code=JPNのデータのNameを5件表示、エラー発生時はターミナルに表示&エラーログを出力するというもの。接続情報は適宜変更。

import pymysql
import logging
from datetime import datetime
from zoneinfo import ZoneInfo

def jst_converter(*args):
    return datetime.now(ZoneInfo('Asia/Tokyo')).timetuple()

logging.Formatter.converter = jst_converter

logging.basicConfig(
    filename="error.log",
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

host = 'db-container'
user = 'xxxxxxxxxx'
password = 'xxxxxxxxxx'
database = 'world'

connection = None

try:

    connection = pymysql.connect(
        host=host, 
        user=user,
        password=password,
        database=database,
        charset='utf8mb4',
        cursorclass=pymysql.cursors.DictCursor
    )

    country_code = 'JPN'

    select_sql = '''
        SELECT * 
        FROM city 
        WHERE CountryCode = %s 
        LIMIT 5;
    '''.strip()

    with connection.cursor() as cursor:
        cursor.execute(select_sql, [country_code])
        cities = cursor.fetchall()
        for city in cities:
            print(city.get('Name'))
except pymysql.MySQLError as e:

    print(f'[error] {e}')
    logging.error('Database error', exc_info=True)
finally:
    if connection is not None:
        connection.close()

ファイルの実行

以下の通り正常に表示された。

# podman exec -it python-container python test.py
Tokyo
Jokohama [Yokohama]
Osaka
Nagoya
Sapporo

テーブル名をわざと「worlds」に書き換えた上で実行すると以下エラー表示。

# podman exec -it python-container python test.py
[error] (1049, "Unknown database 'worlds'")

また、同ディレクトリ内にerror.logが作成される筈。

 

補足

データベース用コンテナに接続できない場合

データベース接続時にIPアドレス指定だと問題なかったが、コンテナ名指定の場合にコンテナ名にドットが入っていると接続エラーが発生した。また、コンテナ名をドットなしに変更すると解決した。

今回使用したPythonイメージはAlpine Linuxとなるが、このOSのDNS名前解決はちょっと特殊っぽい

尚、ドット以外にアンダーバーもあまりよろしくなさそう

そのためコンテナ名は半角英数字(英字は小文字)、半角ハイフンのみにするのがよさそう。

 

参考サイト

https://qiita.com/corestate55/items/8cf2f713b10d0197c29e

https://stackoverflow.com/questions/27791913/what-characters-are-allowed-in-kubernetes-port-and-container-names

 - Podman サーバー Python

  関連記事

AlmaLinux8系にPython3.9系をインストールしHello Worldを表示する方法
AlmaLinux8系にPython3.9系をインストールしHello Worldを表示する方法

WebARENA Indigo&AlmaLinux8.6の環境にPyth ...

Python3.9系&Tesseractを用いて画像をOCR処理する方法
Python3.9系&Tesseractを用いて画像をOCR処理する方法

以前にGASとDrive APIを組み合わせて画像をOCR処理する方法をメモした ...