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 psredis-basic のステータスが Up なら成功です。
次にデータを書き込んでみます:
docker exec -it redis-basic redis-cliRedisシェル内で:
set test "hello"
get test"hello" が返ってくれば正常です。
基礎バージョンの欠点
一見良さそうですが、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つのモードがあります:
- appendfsync always: 書き込み毎に同期(激遅、最強の安全性)
- appendfsync everysec: 毎秒同期(推奨、性能と安全のバランス良し)
- 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 no2. パスワード(重要)
requirepass YourStrongPassword1233. 永続化
# RDB
save 900 1
save 300 10
dbfilename dump.rdb
# AOF
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
# 混合モード
aof-use-rdb-preamble yes
dir /data4. 制限
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.conf に requirepass パスワード を記述。
方法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%防げます。
今日学んだこと:
- デフォルトのRedisコンテナはデータを保持しない。
RDB(スナップショット)とAOF(ログ)でデータを守る。requirepassでパスワードをかけて攻撃を防ぐ。docker-composeと設定ファイルを使って、再現性のあるデプロイをする。
もし今動いているRedisコンテナがあるなら、すぐにチェックしてください。データボリュームはマウントされていますか?設定ファイルは使っていますか?
データの安全性は、事故が起きるまで軽視されがちです。今日のうちに対策しておきましょう。
Docker Redis完全デプロイ手順
永続化設定、Volumeマウント、パスワード保護を含む、データ損失を防ぐためのRedisコンテナ構築フロー
⏱️ Estimated time: 30 min
- 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
Step2: セキュリティ:パスワード認証
設定ファイル(redis.conf)で指定(推奨):
• requirepass yourpassword
Docker Composeでの指定:
• command: redis-server --requirepass yourpassword
確認方法:
• redis-cli -a yourpassword で接続テスト - 3
Step3: 運用:バックアップと監視
チェックリスト:
1. Volumeが正しくマウントされているか
2. 永続化(RDB/AOF)が有効か
3. パスワードが設定されているか
4. メモリ制限(maxmemory)が設定されているか
バックアップ:
• 定期的にVolume内の dump.rdb を別サーバーへコピーする
FAQ
コンテナを再起動するとデータが消えるのはなぜ?
RDBとAOF、どちらを使うべきですか?
RDB:リカバリが早いが、直近のデータ(数分)を失うリスクがある。
AOF:データロスは最小限(1秒程度)だが、ファイルが大きくリカバリが遅い。
Redis 4.0以降の混合モードなら、RDBの速さとAOFの安全性を両立できます。
Redisのパスワード設定方法は?
4 min read · 公開日: 2025年12月17日 · 更新日: 2026年1月22日
関連記事
Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践

Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践
Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド

Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド
Next.js ユニットテスト実践:Jest + React Testing Library 完全設定ガイド


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