T-CREATOR

Redis Docker Compose 構築:永続化・監視・TLS まで 1 ファイルで

Redis Docker Compose 構築:永続化・監視・TLS まで 1 ファイルで

Redis をプロダクション環境で運用する際、永続化設定、監視、セキュリティ対策が不可欠です。これらを 1 つの docker-compose.yml ファイルで完結させることで、環境構築の手間を大幅に削減できます。

本記事では、Redis Server の構築から永続化設定、Redis Insight による監視、TLS 通信の実装まで、実務で使える構成を段階的に解説していきますね。初めて Redis を Docker Compose で構築する方でも、この記事を読めば本番運用レベルの環境を作れるようになります。

背景

Redis の役割と Docker 化のメリット

Redis はインメモリデータベースとして Web アプリケーションのキャッシュ、セッション管理、リアルタイムデータ処理に広く活用されています。高速なデータアクセスが求められるモダンなアプリケーションでは、Redis は欠かせない存在となっていますね。

Docker Compose を使うことで、開発環境と本番環境の差異を最小化し、チーム全体で同じ環境を共有できます。また、バージョン管理やスケーリングも容易になるため、DevOps 実践においても重要な技術です。

以下の図は、一般的な Web アプリケーションにおける Redis の位置づけを示しています。

mermaidflowchart TB
    client["クライアント<br/>(ブラウザ)"]
    app["Webアプリケーション<br/>(Next.js/Node.js)"]
    redis["Redis<br/>(キャッシュ層)"]
    db[("MySQL/PostgreSQL<br/>(永続化層)")]

    client -->|HTTPリクエスト| app
    app -->|1. キャッシュ確認| redis
    redis -->|キャッシュヒット| app
    app -->|2. キャッシュミス時| db
    db -->|データ取得| app
    app -->|3. キャッシュ保存| redis
    app -->|HTTPレスポンス| client

図から読み取れる要点:

  • Redis はアプリケーションとデータベースの間に位置するキャッシュ層
  • 頻繁にアクセスされるデータをメモリに保持し、データベースへの負荷を軽減
  • レスポンス時間の短縮に貢献

Redis の永続化とセキュリティの必要性

Redis はインメモリデータベースですが、データの永続化機能も備えています。RDB(スナップショット)と AOF(Append Only File)の 2 つの方式があり、用途に応じて使い分けることが重要です。

また、本番環境では TLS/SSL による通信の暗号化が求められます。クレデンシャル情報やセッションデータを扱う場合、暗号化なしでは情報漏洩のリスクが高まりますね。

監視機能も見逃せません。Redis Insight を導入することで、メモリ使用量、接続数、コマンド実行状況をリアルタイムで可視化でき、パフォーマンスチューニングや障害対応がスムーズになります。

課題

本番運用を想定した構築の複雑さ

Redis を単に Docker で起動するだけなら簡単ですが、本番運用を見据えた構成は複雑になりがちです。具体的には以下の課題があります。

データ永続化の課題:

  • コンテナ再起動時にデータが消失してしまう
  • RDB と AOF の設定を適切に行わないと、データ損失のリスクがある
  • スナップショット取得のタイミングやファイルサイズの管理が必要

セキュリティの課題:

  • デフォルト設定では認証なしでアクセス可能
  • 平文通信のため、ネットワーク盗聴のリスクがある
  • TLS 証明書の生成と設定が煩雑

監視・運用の課題:

  • コマンドラインツールだけではメトリクスの可視化が困難
  • メモリ使用量の監視やアラート設定が別途必要
  • 複数のツールを組み合わせると設定ファイルが分散する

以下の図は、これらの課題がどのように関連しているかを示しています。

mermaidflowchart TD
    start["Redis構築開始"]
    basic["基本的な起動"]
    issues["本番運用の課題"]

    persist["データ永続化"]
    security["セキュリティ"]
    monitor["監視・運用"]

    risk1["データ損失リスク"]
    risk2["情報漏洩リスク"]
    risk3["障害検知遅延"]

    start --> basic
    basic --> issues
    issues --> persist
    issues --> security
    issues --> monitor

    persist --> risk1
    security --> risk2
    monitor --> risk3

図で理解できる要点:

  • 基本的な起動だけでは本番運用の課題をカバーできない
  • 永続化、セキュリティ、監視の 3 つの柱が重要
  • それぞれの課題が異なるリスクに直結

設定ファイルの分散と管理コスト

Redis 本体の設定、TLS 証明書の生成スクリプト、監視ツールの設定を別々に管理すると、環境構築の手順が複雑化します。新しいメンバーがプロジェクトに参加した際の学習コストも増大しますね。

理想的には、1 つの docker-compose.yml ファイルで全ての設定を完結させ、docker compose upコマンド 1 つで環境が立ち上がる状態が望ましいです。

解決策

1 ファイルで完結する Docker Compose 構成

本記事で紹介する構成では、以下の要素を 1 つの docker-compose.yml ファイルに集約します。

#構成要素役割
1Redis Serverデータストア本体、永続化設定を含む
2Redis InsightWeb UI による監視・管理ツール
3TLS 証明書生成自己署名証明書の自動生成
4Docker Volumeデータとログの永続化
5Docker Networkサービス間の安全な通信

この構成により、以下のメリットが得られます。

環境構築の簡素化:

  • 複雑な手順書が不要になる
  • docker compose up -dだけで全てのサービスが起動
  • チーム全体で同一環境を即座に再現可能

運用の効率化:

  • 設定変更が 1 ファイルで完結
  • バージョン管理が容易
  • 環境のポータビリティが向上

以下の図は、Docker Compose によるサービス構成を示しています。

mermaidflowchart LR
    compose["docker-compose.yml"]

    subgraph services["Docker Services"]
        redis["redis<br/>(Redis Server)"]
        insight["redis-insight<br/>(監視UI)"]
        cert["cert-generator<br/>(証明書生成)"]
    end

    subgraph volumes["Volumes"]
        data["redis-data"]
        logs["redis-logs"]
        certs["redis-certs"]
    end

    subgraph network["Network"]
        redisnet["redis-network"]
    end

    compose --> services
    redis --> data
    redis --> logs
    redis --> certs
    insight --> certs
    cert --> certs

    redis -.->|TLS通信| redisnet
    insight -.->|TLS通信| redisnet

図で理解できる要点:

  • 3 つのサービスが連携して動作
  • Volume によりデータが永続化
  • 専用ネットワークで安全に通信

RDB + AOF によるハイブリッド永続化

Redis の永続化は、RDB と AOF を組み合わせることで信頼性が高まります。

RDB(スナップショット)の特徴:

  • 定期的にメモリ内のデータをディスクに保存
  • ファイルサイズが小さく、復旧が高速
  • スナップショット間のデータは失われる可能性がある

AOF(Append Only File)の特徴:

  • 全ての書き込みコマンドをログとして記録
  • データ損失のリスクが最小限
  • ファイルサイズが大きくなる傾向がある

これら 2 つを併用することで、高速な復旧と高いデータ保護を両立できます。

TLS による通信暗号化

自己署名証明書を使用し、Redis クライアントと Redis Server 間の通信を TLS/SSL で暗号化します。本番環境では認証局から取得した証明書を使用しますが、開発環境やプライベートネットワークでは自己署名証明書が有効です。

証明書の生成は Docker コンテナ内で自動化し、手動での作業を不要にします。

Redis Insight による可視化

Redis Insight は、RedisLabs が提供する公式の GUI ツールです。以下の機能を備えています。

#機能説明
1データブラウザキーと値をグラフィカルに表示・編集
2パフォーマンス監視メモリ使用量、接続数、コマンド統計
3CLI 統合Web 上で Redis CLI を実行可能
4プロファイリングスロークエリの検出

これにより、運用時の可視性が大幅に向上します。

具体例

全体のディレクトリ構成

プロジェクトのディレクトリ構成は以下のようになります。

bashredis-docker/
├── docker-compose.yml          # メインの設定ファイル
├── redis/
│   └── redis.conf              # Redis設定ファイル
├── certs/                      # TLS証明書(自動生成)
│   ├── ca.crt
│   ├── redis.crt
│   └── redis.key
├── data/                       # Redisデータ(永続化)
└── logs/                       # Redisログ

このシンプルな構成で、全ての機能を実現します。

Docker Compose 設定ファイルの作成

まず、docker-compose.yml ファイルを作成します。このファイルには 3 つのサービスを定義します。

バージョンとネットワーク定義

最初に、Docker Compose のバージョンとネットワークを定義します。

yamlversion: '3.8'

networks:
  redis-network:
    driver: bridge

Volume 定義

データ永続化のための Volume を定義します。

yamlvolumes:
  redis-data:
    driver: local
  redis-logs:
    driver: local
  redis-certs:
    driver: local

これらの Volume により、コンテナを削除してもデータが保持されます。

TLS 証明書生成サービス

証明書を自動生成するサービスを定義します。このサービスはワンショットで実行され、証明書生成後に終了します。

yamlservices:
  cert-generator:
    image: alpine:latest
    container_name: redis-cert-generator
    volumes:
      - redis-certs:/certs
    command: >
      sh -c "
        apk add --no-cache openssl &&
        cd /certs &&
        if [ ! -f redis.key ]; then
          echo 'Generating TLS certificates...' &&
          openssl genrsa -out ca.key 4096 &&
          openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj '/CN=Redis CA' &&
          openssl genrsa -out redis.key 4096 &&
          openssl req -new -key redis.key -out redis.csr -subj '/CN=redis' &&
          openssl x509 -req -days 3650 -in redis.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out redis.crt &&
          chmod 644 redis.crt ca.crt &&
          chmod 600 redis.key &&
          echo 'Certificates generated successfully';
        else
          echo 'Certificates already exist';
        fi
      "

このサービスの処理内容:

  • Alpine Linux を使用し軽量化
  • OpenSSL で自己署名証明書を生成
  • CA(認証局)証明書、サーバー証明書、秘密鍵を作成
  • ファイルパーミッションを適切に設定
  • 既存の証明書がある場合はスキップ

証明書の有効期限は 10 年(3650 日)に設定しています。

Redis Server 設定

次に、Redis Server のサービスを定義します。このサービスが中核となります。

yamlredis:
  image: redis:7.2-alpine
  container_name: redis-server
  restart: unless-stopped
  ports:
    - '6379:6379'
  volumes:
    - redis-data:/data
    - redis-logs:/var/log/redis
    - redis-certs:/certs:ro
    - ./redis/redis.conf:/usr/local/etc/redis/redis.conf:ro
  networks:
    - redis-network
  depends_on:
    cert-generator:
      condition: service_completed_successfully

設定のポイント:

  • Redis 7.2 を使用(最新の安定版)
  • restart: unless-stoppedで自動再起動を設定
  • ポート 6379 を公開
  • 証明書は読み取り専用(:ro)でマウント
  • 証明書生成完了後に起動

Redis 起動コマンドの設定

Redis の起動コマンドを設定し、認証と TLS を有効にします。

yamlcommand: >
  redis-server
  --requirepass your_strong_password_here
  --tls-port 6379
  --port 0
  --tls-cert-file /certs/redis.crt
  --tls-key-file /certs/redis.key
  --tls-ca-cert-file /certs/ca.crt
  --tls-auth-clients no
  --save 900 1
  --save 300 10
  --save 60 10000
  --appendonly yes
  --appendfsync everysec
  --dir /data
  --logfile /var/log/redis/redis-server.log

コマンドオプションの説明:

#オプション説明
1--requirepassパスワード認証を設定(本番では必ず変更)
2--tls-port 6379TLS ポートを 6379 に設定
3--port 0非暗号化ポートを無効化
4--tls-cert-fileサーバー証明書のパス
5--tls-key-file秘密鍵のパス
6--tls-ca-cert-fileCA 証明書のパス
7--tls-auth-clients noクライアント証明書を要求しない
8--saveRDB スナップショットの保存間隔
9--appendonly yesAOF を有効化
10--appendfsync everysec1 秒ごとにディスクに同期

RDB 保存ポリシーの詳細:

  • 900 1:900 秒(15 分)で 1 件以上の変更があれば保存
  • 300 10:300 秒(5 分)で 10 件以上の変更があれば保存
  • 60 10000:60 秒(1 分)で 10000 件以上の変更があれば保存

このハイブリッド設定により、高頻度の書き込みにも対応しながらデータ保護を実現します。

Redis Insight 設定

最後に、監視ツールの Redis Insight を設定します。

yamlredis-insight:
  image: redis/redisinsight:latest
  container_name: redis-insight
  restart: unless-stopped
  ports:
    - '5540:5540'
  volumes:
    - redis-certs:/certs:ro
  networks:
    - redis-network
  depends_on:
    - redis
  environment:
    - REDIS_HOSTS=local:redis:6379

設定のポイント:

  • ポート 5540 で Web UI にアクセス可能
  • Redis サービスの起動後に開始
  • 証明書を共有して TLS 接続に対応

Redis Insight には、ブラウザでhttp:​/​​/​localhost:5540にアクセスすることで利用できます。

完全な docker-compose.yml ファイル

以下が完全な設定ファイルです。このファイル 1 つで全ての機能が動作します。

yamlversion: '3.8'

networks:
  redis-network:
    driver: bridge

volumes:
  redis-data:
    driver: local
  redis-logs:
    driver: local
  redis-certs:
    driver: local

services:
  # TLS証明書生成サービス
  cert-generator:
    image: alpine:latest
    container_name: redis-cert-generator
    volumes:
      - redis-certs:/certs
    command: >
      sh -c "
        apk add --no-cache openssl &&
        cd /certs &&
        if [ ! -f redis.key ]; then
          echo 'Generating TLS certificates...' &&
          openssl genrsa -out ca.key 4096 &&
          openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj '/CN=Redis CA' &&
          openssl genrsa -out redis.key 4096 &&
          openssl req -new -key redis.key -out redis.csr -subj '/CN=redis' &&
          openssl x509 -req -days 3650 -in redis.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out redis.crt &&
          chmod 644 redis.crt ca.crt &&
          chmod 600 redis.key &&
          echo 'Certificates generated successfully';
        else
          echo 'Certificates already exist';
        fi
      "

  # Redis Server
  redis:
    image: redis:7.2-alpine
    container_name: redis-server
    restart: unless-stopped
    ports:
      - '6379:6379'
    volumes:
      - redis-data:/data
      - redis-logs:/var/log/redis
      - redis-certs:/certs:ro
    networks:
      - redis-network
    depends_on:
      cert-generator:
        condition: service_completed_successfully
    command: >
      redis-server
      --requirepass your_strong_password_here
      --tls-port 6379
      --port 0
      --tls-cert-file /certs/redis.crt
      --tls-key-file /certs/redis.key
      --tls-ca-cert-file /certs/ca.crt
      --tls-auth-clients no
      --save 900 1
      --save 300 10
      --save 60 10000
      --appendonly yes
      --appendfsync everysec
      --dir /data
      --logfile /var/log/redis/redis-server.log

  # Redis Insight(監視UI)
  redis-insight:
    image: redis/redisinsight:latest
    container_name: redis-insight
    restart: unless-stopped
    ports:
      - '5540:5540'
    volumes:
      - redis-certs:/certs:ro
    networks:
      - redis-network
    depends_on:
      - redis
    environment:
      - REDIS_HOSTS=local:redis:6379

環境の起動と確認

作成した docker-compose.yml を使って環境を起動します。

サービスの起動

以下のコマンドで全てのサービスを起動します。

bash# バックグラウンドで起動
docker compose up -d

# ログを確認しながら起動(初回推奨)
docker compose up

初回起動時は、証明書の生成プロセスが実行されます。ログに「Certificates generated successfully」と表示されれば成功です。

サービスの状態確認

起動したサービスの状態を確認します。

bash# サービス一覧と状態を表示
docker compose ps

# 各サービスのログを確認
docker compose logs redis
docker compose logs redis-insight

正常に起動していれば、以下のような出力が得られます。

bashNAME                    IMAGE                        STATUS
redis-cert-generator    alpine:latest                Exited (0)
redis-server            redis:7.2-alpine             Up 2 minutes
redis-insight           redis/redisinsight:latest    Up 2 minutes

cert-generator は証明書生成後に終了するため、Exited (0)となるのが正常です。

Redis 接続テスト

redis-cli での接続

TLS を有効にした Redis に接続するには、redis-cli で TLS オプションを指定します。

bash# Dockerコンテナ内でredis-cliを実行
docker exec -it redis-server redis-cli \
  --tls \
  --cert /certs/redis.crt \
  --key /certs/redis.key \
  --cacert /certs/ca.crt \
  -a your_strong_password_here

接続成功後、以下のコマンドでテストできます。

bash# 疎通確認
127.0.0.1:6379> PING
PONG

# データ書き込みテスト
127.0.0.1:6379> SET test_key "Hello Redis"
OK

# データ読み取りテスト
127.0.0.1:6379> GET test_key
"Hello Redis"

Node.js からの接続例

アプリケーションから接続する場合の例を示します。まず、必要なパッケージをインストールします。

bash# ioredisパッケージのインストール
yarn add ioredis

次に、TLS 接続の設定を含むクライアントコードを作成します。

javascript// redis-client.js

const Redis = require('ioredis');
const fs = require('fs');

// TLS証明書を読み込み
const tls = {
  ca: fs.readFileSync('./certs/ca.crt'),
  cert: fs.readFileSync('./certs/redis.crt'),
  key: fs.readFileSync('./certs/redis.key'),
  rejectUnauthorized: false, // 自己署名証明書の場合
};

次に、Redis 接続設定とエラーハンドリングを実装します。

javascript// Redis接続の設定
const redis = new Redis({
  host: 'localhost',
  port: 6379,
  password: 'your_strong_password_here',
  tls: tls,
  retryStrategy: (times) => {
    const delay = Math.min(times * 50, 2000);
    return delay;
  },
});

接続イベントとエラーハンドリングを設定します。

javascript// 接続イベント
redis.on('connect', () => {
  console.log('✓ Redis接続成功');
});

redis.on('error', (err) => {
  console.error('✗ Redis接続エラー:', err);
});

redis.on('ready', () => {
  console.log('✓ Redisが使用可能になりました');
});

最後に、実際のデータ操作を実行します。

javascript// データ操作の例
async function testRedis() {
  try {
    // データ書き込み
    await redis.set(
      'user:1001',
      JSON.stringify({
        name: 'Tanaka Taro',
        email: 'tanaka@example.com',
      })
    );
    console.log('✓ データ書き込み成功');

    // データ読み取り
    const data = await redis.get('user:1001');
    console.log('✓ データ読み取り:', JSON.parse(data));

    // TTL付きデータ
    await redis.setex(
      'session:abc123',
      3600,
      'session_data'
    );
    console.log('✓ セッションデータ保存(TTL: 1時間)');
  } catch (error) {
    console.error('エラー:', error);
  }
}

// テスト実行
testRedis();

このコードを実行すると、TLS 経由で Redis に安全に接続できます。

Redis Insight での監視

ブラウザでhttp:​/​​/​localhost:5540にアクセスし、Redis Insight を開きます。初回アクセス時は接続設定が必要です。

接続設定手順

  1. 「Add Redis Database」をクリック
  2. 以下の情報を入力します:
#項目
1Hostredis
2Port6379
3Database AliasRedis Docker
4Username(空欄)
5Passwordyour_strong_password_here
6Use TLS✓ チェックを入れる
  1. 「Test Connection」で接続を確認
  2. 「Add Redis Database」で保存

接続後、以下の情報を可視化できます。

ダッシュボードで確認できる項目:

  • メモリ使用量とピーク値
  • 接続中のクライアント数
  • 実行されたコマンド数
  • キーの総数とデータ型の分布
  • ヒット率とミス率

ブラウザ機能:

  • キーの一覧表示と検索
  • 値の表示・編集・削除
  • データ型に応じたビューアー(JSON、Hash、List 等)

以下の図は、Redis Insight と Redis Server の監視フローを示しています。

mermaidsequenceDiagram
    participant User as ユーザー
    participant Insight as Redis Insight
    participant Redis as Redis Server

    User->>Insight: ブラウザでアクセス<br/>(port 5540)
    Insight->>Redis: TLS接続確立<br/>(認証情報送信)
    Redis-->>Insight: 認証成功

    Insight->>Redis: INFO コマンド
    Redis-->>Insight: サーバー情報

    Insight->>Redis: DBSIZE コマンド
    Redis-->>Insight: キー数

    Insight->>Redis: MEMORY USAGE
    Redis-->>Insight: メモリ使用量

    Insight-->>User: ダッシュボード表示

図で理解できる要点:

  • Redis Insight は Redis 標準コマンドで情報を取得
  • TLS 接続により安全に通信
  • リアルタイムで統計情報を更新

データ永続化の確認

永続化が正しく機能しているかを確認します。

データ書き込みとコンテナ再起動

以下の手順でデータが保持されることを確認します。

bash# 1. テストデータを書き込む
docker exec -it redis-server redis-cli \
  --tls \
  --cert /certs/redis.crt \
  --key /certs/redis.key \
  --cacert /certs/ca.crt \
  -a your_strong_password_here \
  SET persistent_test "This data should survive restart"

次に、コンテナを再起動してデータの永続性を確認します。

bash# 2. Redisコンテナを再起動
docker compose restart redis

# 3. 再起動後にデータを確認
docker exec -it redis-server redis-cli \
  --tls \
  --cert /certs/redis.crt \
  --key /certs/redis.key \
  --cacert /certs/ca.crt \
  -a your_strong_password_here \
  GET persistent_test

「This data should survive restart」が返ってくれば、永続化が正常に機能しています。

RDB と AOF ファイルの確認

永続化ファイルが生成されているか確認します。

bash# Redisデータディレクトリの内容を確認
docker exec -it redis-server ls -lh /data

# 出力例:
# -rw-r--r-- 1 redis redis  245K Jan 15 12:30 appendonly.aof.1.incr.aof
# -rw-r--r-- 1 redis redis    88 Jan 15 12:30 appendonly.aof.1.base.rdb
# -rw-r--r-- 1 redis redis   110 Jan 15 12:30 appendonly.aof.manifest
# -rw-r--r-- 1 redis redis  1.2M Jan 15 12:30 dump.rdb

RDB ファイル(dump.rdb)と AOF ファイル群が存在していれば、ハイブリッド永続化が機能しています。

エラー処理とトラブルシューティング

実際の運用で遭遇する可能性のあるエラーと対処法を紹介します。

Error 1: 認証エラー

エラーコード: NOAUTH Authentication required

エラーメッセージ:

go(error) NOAUTH Authentication required.

発生条件:

  • パスワードを指定せずに接続した場合
  • 間違ったパスワードを使用した場合

解決方法:

  1. 正しいパスワードを確認する
bash# docker-compose.ymlの--requirepassの値を確認
grep "requirepass" docker-compose.yml
  1. -aオプションでパスワードを指定して再接続
bashdocker exec -it redis-server redis-cli \
  --tls \
  --cert /certs/redis.crt \
  --key /certs/redis.key \
  --cacert /certs/ca.crt \
  -a your_strong_password_here

Error 2: TLS 接続エラー

エラーコード: Error: 139693121169216:error

エラーメッセージ:

vbnetError: Connection lost with error "Error: 139693121169216:error:
1408F10B:SSL routines:ssl3_get_record:wrong version number"

発生条件:

  • TLS ポートに非 TLS クライアントで接続した場合
  • 証明書ファイルのパスが間違っている場合

解決方法:

  1. 証明書ファイルの存在を確認
bash# 証明書が生成されているか確認
docker exec -it redis-server ls -l /certs

# 出力例:
# -rw-r--r-- 1 root root 2049 Jan 15 12:25 ca.crt
# -rw-r--r-- 1 root root 2094 Jan 15 12:25 redis.crt
# -rw------- 1 root root 3272 Jan 15 12:25 redis.key
  1. TLS オプションを正しく指定して接続
bash# 必ず--tlsオプションと証明書パスを指定
docker exec -it redis-server redis-cli \
  --tls \
  --cert /certs/redis.crt \
  --key /certs/redis.key \
  --cacert /certs/ca.crt
  1. 証明書の再生成が必要な場合
bash# 証明書Volumeを削除
docker compose down -v
docker volume rm redis-docker_redis-certs

# 再起動して証明書を再生成
docker compose up -d

Error 3: メモリ不足エラー

エラーコード: OOM command not allowed when used memory > 'maxmemory'

エラーメッセージ:

vbnet(error) OOM command not allowed when used memory > 'maxmemory'.

発生条件:

  • Redis のメモリ使用量が上限に達した場合
  • maxmemory ポリシーが適切に設定されていない場合

解決方法:

  1. 現在のメモリ使用状況を確認
bash# Redis内でメモリ情報を確認
docker exec -it redis-server redis-cli \
  --tls \
  --cert /certs/redis.crt \
  --key /certs/redis.key \
  --cacert /certs/ca.crt \
  -a your_strong_password_here \
  INFO memory
  1. maxmemory とエビクションポリシーを設定

docker-compose.yml の command セクションに以下を追加します。

yamlcommand: >
  redis-server
  --requirepass your_strong_password_here
  --maxmemory 2gb
  --maxmemory-policy allkeys-lru
  # ... 他のオプション

maxmemory-policy の選択肢:

#ポリシー説明推奨用途
1allkeys-lru全てのキーから LRU で削除キャッシュ用途
2allkeys-lfu全てのキーから LFU で削除アクセス頻度重視
3volatile-lruTTL 付きキーから LRU で削除混在用途
4volatile-ttlTTL が短いキーから削除TTL 管理重視
5noevictionエビクションしない(エラー)データ損失厳禁
  1. 設定変更後はサービスを再起動
bashdocker compose restart redis

Error 4: ポート競合エラー

エラーメッセージ:

perlError response from daemon: Ports are not available:
exposing port TCP 0.0.0.0:6379 -> 0.0.0.0:0: listen tcp 0.0.0.0:6379:
bind: address already in use

発生条件:

  • 他のプロセスが既にポート 6379 または 5540 を使用している場合

解決方法:

  1. ポートを使用しているプロセスを確認
bash# macOS/Linuxの場合
lsof -i :6379
lsof -i :5540

# Windowsの場合
netstat -ano | findstr :6379
  1. ポートを変更する

docker-compose.yml の ports セクションを変更します。

yamlservices:
  redis:
    ports:
      - '6380:6379' # ホスト側のポートを6380に変更

  redis-insight:
    ports:
      - '5541:5540' # ホスト側のポートを5541に変更

Error 5: Volume 権限エラー

エラーメッセージ:

vbnetCan't open the log file: Permission denied

発生条件:

  • Docker ボリュームのパーミッションが不適切な場合

解決方法:

  1. ログディレクトリの権限を確認
bashdocker exec -it redis-server ls -ld /var/log/redis
  1. 必要に応じて権限を修正
bash# Redisコンテナ内で権限修正
docker exec -it redis-server chmod 755 /var/log/redis
  1. 環境を再起動
bashdocker compose restart redis

パフォーマンスチューニング

本番環境でのパフォーマンス最適化の設定例を紹介します。

メモリ最適化設定

docker-compose.yml に以下のオプションを追加します。

yamlcommand: >
  redis-server
  --maxmemory 4gb
  --maxmemory-policy allkeys-lru
  --maxmemory-samples 5
  --tcp-backlog 511
  --timeout 300
  # ... 他のオプション

各オプションの意味:

  • maxmemory-samples:LRU アルゴリズムのサンプル数(精度と速度のバランス)
  • tcp-backlog:TCP 接続のバックログキュー(高負荷時の接続待ち)
  • timeout:アイドル接続のタイムアウト秒数

AOF 書き込み戦略の調整

データの重要度に応じて AOF の同期頻度を調整します。

yaml# 高速優先(データ損失リスク増)
--appendfsync no

# バランス型(推奨)
--appendfsync everysec

# 安全優先(パフォーマンス低下)
--appendfsync always

用途に応じて選択してください。

まとめ

本記事では、Redis Docker Compose による本番運用レベルの環境構築を解説しました。1 つの docker-compose.yml ファイルで、以下の機能を実現できます。

実装した主要機能:

  • 永続化:RDB + AOF のハイブリッド方式でデータ保護
  • セキュリティ:TLS/SSL 通信とパスワード認証による多層防御
  • 監視:Redis Insight によるリアルタイムな GUI 監視
  • 運用性:1 コマンドで起動・停止可能な簡素化された構成

本記事の構成がもたらすメリット:

#メリット効果
1環境構築の迅速化新規メンバーも数分で環境を再現可能
2設定の一元管理バージョン管理とレビューが容易
3セキュリティの担保TLS 暗号化で盗聴リスクを軽減
4データ保護コンテナ障害時もデータ損失を防止
5可視性の向上パフォーマンス問題の早期発見

この構成をベースに、本番環境では以下の追加対応を検討してください。

本番環境への展開時の追加検討事項:

  • 認証局発行の正式な TLS 証明書の導入
  • 環境変数や Secrets マネージャーでのパスワード管理
  • レプリケーション構成による高可用性の実現
  • Sentinel/Cluster による自動フェイルオーバー
  • 監視アラートの設定(Prometheus + Grafana 等)
  • バックアップ戦略の策定(RDB 定期取得、AOF アーカイブ)

Redis はシンプルながら強力なツールです。適切な設定と運用体制を整えることで、アプリケーションのパフォーマンスと信頼性を大きく向上させることができます。

今回紹介した構成をそのまま使うことも、プロジェクトの要件に合わせてカスタマイズすることもできます。まずは開発環境で試してみて、チームの運用フローに合わせて調整していくのが良いでしょう。

関連リンク