言語を切り替える
テーマを切り替える

Docker Redisデプロイ完全ガイド:データ消失を防ぐ永続化とパスワード認証設定

金曜日の夜11時、ようやくRedisコンテナが動き出した。インターフェースをいくつかテストして、データの読み書きも正常。ホッとして眠りにつく。月曜日の朝9時、パソコンを開いて習慣的にサービスの状態を確認する——データが全部消えている。

血の気が引く瞬間です。

あなたも経験があるかもしれません。Dockerコンテナを再起動したら、Redisの中のデータがまるで最初から存在しなかったかのように消え失せている。ユーザーのログイン状態が切れ、カートの中身は空になり、キャッシュは消滅。さらに悪いことに、なぜそうなったのか、どうすれば直るのかもわからない。

正直に言うと、私も最初にこれに遭遇したときはパニックになりました。小規模なプロジェクトのテスト環境でしたが、コンテナは本質的に「一時的」なものであり、削除すればデータは消え、設定なしに再起動しても同様だと知ったのは、痛い教訓でした。

この記事では、以下をステップバイステップで解説します:

  • RDBとAOF永続化の設定:コンテナ再起動でもデータを守る方法
  • パスワード認証の設定:不正アクセスや乗っ取り(マイニング被害など)を防ぐ
  • 設定ファイルのマウント:規範的でメンテナンスしやすいデプロイ方法
  • 本番環境のベストプラクティス:ログ確認、ヘルスチェック、性能最適化

バックエンドエンジニアでも、インフラ担当でも、Docker初心者でも、この記事の通りにやれば本番レベルのRedisコンテナを構築できます。

なぜRedisコンテナはデータを失うのか?

例えるなら、Dockerコンテナはホテルの部屋のようなものです。チェックアウトすれば、部屋の中のものは全てリセットされます。コンテナも同様で、削除すれば中のデータは消えます。

Redisはデフォルトでデータをコンテナ内部のファイルシステム(/data/dump.rdb など)に保存します。問題は、このパスがコンテナの中にあることです。コンテナが削除されたり再作成されたりすると、これらのファイルも道連れになります。

あるスタートアップでの実話です。開発者がテスト環境で永続化なしのRedis Dockerを使っていました。サーバー再起動後、全ユーザーのセッションデータが消失し、ログイン状態がリセットされました。テスト環境だから良かったものの、コンテナ化にはデータの永続化設定が不可欠だと痛感させられた出来事でした。

統計によると、Redisコンテナのデータ消失事故の約70%は、永続化ストレージの設定忘れが原因です。つまり、ほぼ誰もが通る落とし穴なのです。

Docker Volumeの役割

Volume(データボリューム)はこの解決策です。重要なデータをPCのHDDに保存するようなものです。

-v パラメータを使ってホストのディレクトリをコンテナ内にマウントすれば、データはホスト上に保存されます。コンテナを削除してもデータは残りますし、再起動しても読み込めます。これが、本番環境で必ずデータボリュームをマウントすべき理由です。

要するに:

  • データボリュームなし = データはコンテナ内 = コンテナ削除でデータ消失
  • データボリュームあり = データはホスト上 = コンテナ削除でもデータ残留

基礎的なRedisコンテナのデプロイ

永続化の前に、まず一番シンプルなRedisコンテナを立ててみましょう。「永続化なし」がどういうものか実感できます。

基礎コンテナの起動

ターミナルで実行します:

docker run -d --name redis-basic -p 6379:6379 redis:latest

このコマンドの意味:

  • -d: バックグラウンド実行
  • --name redis-basic: コンテナ名を指定
  • -p 6379:6379: ホストの6379ポートをコンテナにマッピング
  • redis:latest: 最新のRedisイメージを使用

動作確認

docker ps で確認します:

docker ps

redis-basic のステータスが Up なら成功です。

次にデータを書き込んでみます:

docker exec -it redis-basic redis-cli

Redisシェル内で:

set test "hello"
get test

"hello" が返ってくれば正常です。

基礎バージョンの欠点

一見良さそうですが、3つの致命的な問題があります:

  1. データ非永続:コンテナ再起動でデータが消える可能性がある
  2. パスワードなし:誰でも接続してデータを操作・盗難できる
  3. デフォルト設定:メモリ制限や永続化ポリシーが調整されていない

試してみましょう。コンテナを再起動してデータを確認します:

docker restart redis-basic
docker exec -it redis-basic redis-cli
get test

おそらく test キーは消えているか、あるいは運良く残っているかもしれませんが(Redisはデフォルトで一定間隔でRDB保存しようとしますが、コンテナの強制終了タイミングによっては消えます)、確実ではありません。コンテナを rm して作り直せば、確実に消えます。

RDB永続化の設定(スナップショット)

RedisにはRDBとAOFという2つの永続化方式があります。まずはシンプルなRDBから。

RDBとは?

RDB(Redis Database)は、メモリ上のデータをある時点のスナップショットとして保存します。定期的に全データを dump.rdb ファイルに書き出します。

メリットはリカバリ速度が速いこと。デメリットは最後のスナップショット以降のデータが消える可能性があることです。例えば5分ごとの保存設定だと、クラッシュ時に最大5分間のデータが失われます。

RDBの設定パラメータ

save パラメータで制御します。形式は save <秒数> <変更キー数> です。

例:

  • save 900 1: 15分間に1つ以上のキー変更で保存
  • save 300 10: 5分間に10個以上の変更で保存
  • save 60 10000: 1分間に10000個以上の変更で保存

これらは「OR(または)」条件です。

データボリュームをマウントして永続化

設定だけでなく、ファイルをホストに保存する必要があります。

データディレクトリを作成:

mkdir -p ~/redis-data

永続化ありで起動:

docker run -d \
  --name redis-rdb \
  -p 6379:6379 \
  -v ~/redis-data:/data \
  redis:latest \
  redis-server --save 60 1 --dir /data

ポイント:

  • -v ~/redis-data:/data: ホストのディレクトリをコンテナの /data にマウント
  • --save 60 1: 60秒に1回の変更で保存(テスト用)
  • --dir /data: 保存先を /data(マウントポイント)に指定

永続化の検証

データを書き込みます:

docker exec -it redis-rdb redis-cli
set user:1 "Tanaka"

60秒待ち(保存トリガー)、コンテナを再起動します:

docker restart redis-rdb

データを確認:

docker exec -it redis-rdb redis-cli
get user:1

"Tanaka" が返ってくれば成功です!ホストの ~/redis-data ディレクトリに dump.rdb があるはずです。

AOF永続化の設定(ログ追加方式)

データ安全性を高めたいならAOF(Append Only File)です。

AOFとは?

全ての書き込み操作(set, del, incr等)をログとして appendonly.aof ファイルに追記し続けます。RDBが写真なら、AOFは動画録画です。

メリットはデータロスが少ないこと(設定により最大1秒)。デメリットはファイルサイズが大きくなり、リカバリがRDBより遅いことです。

AOFの同期ポリシー

3つのモードがあります:

  1. appendfsync always: 書き込み毎に同期(激遅、最強の安全性)
  2. appendfsync everysec: 毎秒同期(推奨、性能と安全のバランス良し)
  3. appendfsync no: OS任せ(高速だがデータロスのリスクあり)

本番環境では everysec 一択です。

AOFでの起動

docker run -d \
  --name redis-aof \
  -p 6379:6379 \
  -v ~/redis-data:/data \
  redis:latest \
  redis-server --appendonly yes --appendfsync everysec --dir /data

混合永続化(Redis 4.0+ 推奨)

最新のベストプラクティスは、RDBとAOFのいいとこ取りをした混合モードです。

aof-use-rdb-preamble yes

再起動時、RDBで高速復旧し、その後の差分をAOFで埋めます。Redis 4.0以降ならこれを使っておけば間違いありません。

設定ファイル(redis.conf)での管理

コマンドライン引数(--appendonly yes 等)は長くなりすぎて管理が大変です。本番では設定ファイルを使います。

設定ファイルの入手

公式イメージからデフォルト設定をコピーします:

mkdir -p ~/redis-config
docker run --rm redis:latest cat /etc/redis/redis.conf > ~/redis-config/redis.conf

設定ファイルの編集

redis.conf を編集して最適化します:

1. ネットワーク

bind 0.0.0.0
protected-mode no

2. パスワード(重要)

requirepass YourStrongPassword123

3. 永続化

# RDB
save 900 1
save 300 10
dbfilename dump.rdb

# AOF
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

# 混合モード
aof-use-rdb-preamble yes

dir /data

4. 制限

maxmemory 512mb
maxmemory-policy allkeys-lru

設定ファイルを使って起動

docker run -d \
  --name redis-prod \
  -p 6379:6379 \
  -v ~/redis-config/redis.conf:/usr/local/etc/redis/redis.conf \
  -v ~/redis-data:/data \
  redis:latest \
  redis-server /usr/local/etc/redis/redis.conf

パスワード認証の設定

Redisがハッキングされてマイニングに使われる事件は後を絶ちません。パスワード設定は必須です。

設定方法

方法1:設定ファイル(推奨)
redis.confrequirepass パスワード を記述。

方法2:コマンドライン

redis-server --requirepass "SecretPass"

(履歴に残るため非推奨)

接続方法

パスワード設定後は接続時に認証が必要です:

docker exec -it redis-prod redis-cli -a YourStrongPassword123

または接続後に AUTH YourStrongPassword123 コマンドを実行します。

Docker Composeによるデプロイ(チーム推奨)

コマンド管理は面倒なので、docker-compose.yml を使いましょう。

完全な docker-compose.yml 例

version: '3.8'

services:
  redis:
    image: redis:7.2-alpine
    container_name: redis-prod
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - ./redis-config/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis-data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    # ヘルスチェック設定
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3

volumes:
  redis-data:
    driver: local

これなら docker-compose up -d 一発で起動でき、設定もGitで管理できます。

本番環境チェックリスト

デプロイ前に確認しましょう:

  • 永続化は設定済みか?(RDB+AOF混合推奨)
  • Volumeはマウントされているか?(ホストにデータがあるか)
  • パスワードは設定されているか?(16文字以上の強固なもの)
  • メモリ制限はあるか?(maxmemory設定)
  • 危険なコマンドは無効化されているか?(FLUSHALLなどをrename)
  • 公网(パブリック)アクセスは制限されているか?(ファイアウォール確認)

結論

最初の話に戻りましょう。Redisデータが消える悲劇は、Volumeマウントと永続化設定で100%防げます。

今日学んだこと:

  1. デフォルトのRedisコンテナはデータを保持しない。
  2. RDB(スナップショット)と AOF(ログ)でデータを守る。
  3. requirepass でパスワードをかけて攻撃を防ぐ。
  4. docker-compose と設定ファイルを使って、再現性のあるデプロイをする。

もし今動いているRedisコンテナがあるなら、すぐにチェックしてください。データボリュームはマウントされていますか?設定ファイルは使っていますか?

データの安全性は、事故が起きるまで軽視されがちです。今日のうちに対策しておきましょう。

Docker Redis完全デプロイ手順

永続化設定、Volumeマウント、パスワード保護を含む、データ損失を防ぐためのRedisコンテナ構築フロー

⏱️ Estimated time: 30 min

  1. 1

    Step1: 基礎設定:Volumeマウントと永続化

    Volume作成とマウント:
    • docker run -d -v redis-data:/data redis:7.0
    • これによりコンテナ削除時もデータが保持される

    RDB永続化設定(redis.conf):
    • save 900 1(15分に1回)
    • save 300 10(5分に10回変更)
    • save 60 10000(1分に1万回変更)

    AOF永続化設定:
    • appendonly yes
    • appendfsync everysec(毎秒同期、推奨)

    推奨:混合モード(RDB+AOF)を有効化
  2. 2

    Step2: セキュリティ:パスワード認証

    設定ファイル(redis.conf)で指定(推奨):
    • requirepass yourpassword

    Docker Composeでの指定:
    • command: redis-server --requirepass yourpassword

    確認方法:
    • redis-cli -a yourpassword で接続テスト
  3. 3

    Step3: 運用:バックアップと監視

    チェックリスト:
    1. Volumeが正しくマウントされているか
    2. 永続化(RDB/AOF)が有効か
    3. パスワードが設定されているか
    4. メモリ制限(maxmemory)が設定されているか

    バックアップ:
    • 定期的にVolume内の dump.rdb を別サーバーへコピーする

FAQ

コンテナを再起動するとデータが消えるのはなぜ?
Redisはデフォルトでデータをコンテナ内部のファイルシステムに保存します。コンテナが削除・再作成されると内部データも消えます。また、永続化(RDB/AOF)が無効な場合、メモリ上のデータはプロセス終了と共に消えます。解決策は「永続化の有効化」と「Volumeマウント」の2つを組み合わせることです。
RDBとAOF、どちらを使うべきですか?
本番環境では「両方(混合モード)」が推奨です。
RDB:リカバリが早いが、直近のデータ(数分)を失うリスクがある。
AOF:データロスは最小限(1秒程度)だが、ファイルが大きくリカバリが遅い。
Redis 4.0以降の混合モードなら、RDBの速さとAOFの安全性を両立できます。
Redisのパスワード設定方法は?
redis.conf設定ファイルに「requirepass [パスワード]」と記述するのが最も安全で標準的です。docker runコマンドの引数で渡すこともできますが、履歴に残るため推奨されません。

4 min read · 公開日: 2025年12月17日 · 更新日: 2026年1月22日

コメント

GitHubアカウントでログインしてコメントできます

関連記事