クライアント (c) であるRHEL 9.5サーバーの /mnt/nfs/postgres_data ディレクトリは、すでにOSによってNFSマウントされています。Docker Composeには、このOSがマウントした既存のホスト側ディレクトリを、コンテナ内のディレクトリに「バインド(bind)」する機能を使います。
docker-compose.yml の具体例以下は、クライアント (c) のRHELサーバー(アプリサーバー)の /mnt/nfs/postgres_data を、PostgreSQLコンテナのデータディレクトリとして使用する docker-compose.yml の設定例です。
ファイル名: docker-compose.yml
# docker-compose.yml
version: '3.8'
services:
# PostgreSQL データベースサービス
db:
# 公式のPostgreSQLイメージ (バージョン16を推奨)
image: postgres:16
# コンテナが停止した場合、常に再起動する
restart: always
# データベースの基本設定 (環境変数)
environment:
# POSTGRES_USER: データベースのスーパーユーザー名
POSTGRES_USER: "myadmin"
# POSTGRES_PASSWORD: スーパーユーザーのパスワード (必ず強固なものに変更してください)
POSTGRES_PASSWORD: "YourSecurePassword123"
# POSTGRES_DB: 作成するデフォルトのデータベース名
POSTGRES_DB: "myapp_db"
# ボリューム(データ永続化)の設定 (ここが最重要)
volumes:
# [ホスト(c)のパス]:[コンテナ内のパス]:[SELinuxオプション]
- /mnt/nfs/postgres_data:/var/lib/postgresql/data:Z
# (オプション) ホストのポート5432をコンテナの5432にマッピング
# ports:
# - "5432:5432"
上記の docker-compose.yml の核心は volumes セクションの記述です。
volumes: - /mnt/nfs/postgres_data:/var/lib/postgresql/data:Z
この一行は、3つの部分に分解されます。
/mnt/nfs/postgres_datapgdata:のような名前付きボリューム)を使うのではなく、RHELサーバー(クライアントc)上に既にあるこの絶対パスのディレクトリを使ってください」と指示しています。/mnt/nfs/postgres_data というディレクトリ」として扱います。fstabで設定済み)しているため、結果としてDockerコンテナがこのディレクトリに書き込むデータは、すべてOSを経由してネットワーク越しにNFSサーバー (n) へ送信されます。/var/lib/postgresql/datapostgres:16 イメージが「データベースのファイルを保存する場所」として内部的に定義している標準のパスです。/var/lib/postgresql/data へのすべての読み書きが、ホスト (c) の /mnt/nfs/postgres_data(=NFS共有)への読み書きにリダイレクトされます。:Z