用 Docker 安裝并啟動 Redis:從入門到實戰
Redis 作為一款高性能的鍵值對數據庫,在緩存、會話存儲、消息隊列等場景中被廣泛應用。本文將詳細介紹如何使用 Docker 快速安裝和啟動 Redis,包括基礎配置、數據持久化以及容器管理等核心操作,適合初學者快速上手。
一、準備工作:安裝 Docker 環境
在開始之前,請確保你的系統已經安裝了 Docker。如果尚未安裝,可以按照以下步驟操作:
1. 安裝 Docker(以 CentOS 為例)
bash
# 更新系統包
sudo yum update -y# 安裝Docker依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加Docker軟件源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安裝Docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io# 啟動Docker服務并設置開機自啟
sudo systemctl start docker
sudo systemctl enable docker# 驗證Docker是否安裝成功
sudo docker --version
2. 非 root 用戶配置(可選)
為了避免每次使用docker
命令都需要sudo
權限,可以將當前用戶添加到docker
用戶組:
bash
sudo usermod -aG docker $USER
# 生效配置(需要重新登錄)
newgrp docker
二、Docker 安裝 Redis:兩種常用方式
方式 1:快速啟動默認配置的 Redis
如果只需要臨時使用 Redis 進行測試,最簡單的方式是直接運行官方鏡像:
bash
docker run --name redis-test -p 6379:6379 -d redis
參數說明:
--name redis-test
:給容器命名為redis-test
-p 6379:6379
:將主機的 6379 端口映射到容器的 6379 端口-d
:后臺運行容器redis
:使用最新版本的 Redis 官方鏡像
方式 2:自定義配置啟動 Redis(推薦生產環境)
對于實際生產環境,我們需要自定義 Redis 配置(如設置密碼、持久化策略等),并確保數據持久化到主機。
步驟 1:創建配置文件和數據目錄
bash
# 創建存放Redis配置和數據的目錄
mkdir -p /usr/local/redis/{conf,data}# 創建并編輯Redis配置文件
vi /usr/local/redis/conf/redis.conf
步驟 2:編寫 Redis 配置文件
在redis.conf
中添加以下基礎配置(根據需求調整):
conf
# bind 192.168.1.100 10.0.0.1
# 表示注釋(該行不生效)。
#bind 用于指定 Redis 監聽的網絡接口地址(即允許哪些 IP 的客戶端連接)。
#這里注釋掉表示:不限制特定 IP,Redis 默認監聽服務器上所有可用的網絡接口(所有 IP 均可連接,除非受保護模式限制)。# bind 127.0.0.1 ::1
#同樣是注釋,127.0.0.1 是 IPv4 本地回環地址(僅本機可連接),::1 是 IPv6 本地回環地址。
#注釋掉表示:Redis 不僅允許本地連接,還允許遠程 IP 連接(需配合保護模式配置)。#bind 127.0.0.1
注釋掉的單行本地回環地址綁定。若生效,Redis 僅允許本機(127.0.0.1)連接,拒絕所有遠程請求。protected-mode no
#保護模式開關:no 表示關閉保護模式:允許外部網絡連接(即使未綁定特定 IP 且未設置密碼也能連接,生產環境不建議關閉)。
#若開啟(yes),則僅允許本地連接,或需同時滿足 “綁定了特定 IP” 和 “設置了密碼” 才能遠程連接。port 6379
#指定 Redis 服務監聽的端口號,默認是 6379(Redis 官方默認端口)。tcp-backlog 511
#TCP 連接的 “待處理隊列長度”:當客戶端發起連接請求(三次握手完成后),會先進入該隊列等待 Redis 處理。
#511 是默認值,實際生效值受系統內核參數(如net.core.somaxconn)限制。requirepass 123456
#設置 Redis 客戶端連接的密碼:客戶端需通過 AUTH 123456 命令驗證后才能操作 Redis(這里密碼為123456,生產環境建議使用復雜密碼)。timeout 0
#客戶端空閑超時時間(單位:秒):若客戶端超過該時間未發送任何命令,Redis 會主動關閉連接。
#0 表示不超時(客戶端可一直保持連接)。tcp-keepalive 300
#TCP 保活機制(單位:秒):Redis 每 300 秒向客戶端發送一次 TCP 保活探針,檢測客戶端是否仍在線(避免無效連接長期占用資源)。daemonize no
#是否以守護進程(后臺)模式運行:
#no 表示在前臺運行(日志直接輸出到終端,關閉終端則 Redis 進程終止)。
#yes 表示在后臺運行(需配合pidfile記錄進程 ID)。supervised no
#指定 Redis 是否由系統管理進程(如 systemd、upstart)監控:
#no 表示不依賴任何系統管理進程。
#若為systemd,則 Redis 會配合 systemd 的進程管理機制運行。pidfile /var/run/redis_6379.pid
#當daemonize yes(守護進程模式)時,Redis 會將自身進程 ID(PID)寫入該文件,用于系統管理(如停止服務時通過 PID 定位進程)。loglevel notice
#日志級別:控制日志輸出的詳細程度,可選值(從低到高):
#debug(調試信息,最詳細)、verbose(詳細信息)、notice(通知 + 警告 + 錯誤)、warning(警告 + 錯誤)、error(僅錯誤)。
#這里notice表示記錄重要通知、警告和錯誤信息。logfile ""
#日志文件路徑:
#空字符串("")表示日志輸出到標準輸出(終端)。
#若為守護進程模式,建議指定文件路徑(如/var/log/redis.log),避免日志丟失。databases 16
#設置 Redis 默認創建的數據庫數量:客戶端可通過 SELECT <dbid> 命令切換數據庫(編號從 0 到 29,默認 16 個庫)。always-show-logo yes
#Redis 啟動時是否顯示 Logo:yes 表示顯示 Redis 的 ASCII 藝術 Logo,no 表示不顯示。save 900 1
#RDB 持久化觸發條件:900 秒(15 分鐘)內有至少 1 個鍵被修改,則自動執行bgsave生成 RDB 快照。save 300 10
#RDB 觸發條件:300 秒(5 分鐘)內有至少 10 個鍵被修改,自動生成 RDB 快照。save 60 10000
#RDB 觸發條件:60 秒(1 分鐘)內有至少 10000 個鍵被修改,自動生成 RDB 快照。stop-writes-on-bgsave-error yes
#當 RDB 持久化(bgsave)失敗時,是否停止 Redis 接收寫入操作:
#yes 表示停止(防止數據丟失,強制人工處理錯誤)。
#no 表示繼續接收寫入(可能導致數據無法持久化,有風險)。rdbcompression yes
#是否對 RDB 文件進行壓縮:
#yes 表示壓縮(節省磁盤空間,但消耗 CPU)。
#no 表示不壓縮(節省 CPU,但文件更大)。rdbchecksum yes
#是否在 RDB 文件末尾添加校驗和:
#yes 表示添加(用于驗證 RDB 文件完整性,增加少量 CPU 消耗)。
#no 表示不添加(節省 CPU,但無法檢測文件損壞)。dbfilename dump.rdb
#RDB 持久化文件的名稱(默認dump.rdb),存儲路徑由dir參數指定。dir ./
#RDB 和 AOF 文件的存儲目錄:./ 表示 Redis 啟動時的當前工作目錄(建議指定絕對路徑,如/var/lib/redis)。replica-serve-stale-data yes
#從節點(replica)與主節點(master)斷開連接時,是否繼續響應客戶端請求:
#yes 表示繼續(返回舊數據,保證可用性)。
#no 表示僅響應INFO和SLAVEOF命令,拒絕其他請求(保證數據一致性)。replica-read-only yes
#從節點是否為只讀模式:yes 表示從節點不能執行寫入操作(僅主節點可寫,保證主從數據一致)。repl-diskless-sync no
#是否啟用 “無盤復制”(主節點向從節點同步數據時不寫入磁盤):
#no 表示不啟用(傳統方式:主節點生成 RDB 文件寫入磁盤,再發送給從節點)。
#yes 表示啟用(主節點直接通過網絡發送 RDB 數據給從節點,節省磁盤 IO,適合網絡快的場景)。repl-disable-tcp-nodelay no
#是否禁用 TCP_NODELAY 選項(影響主從數據同步的延遲):
#no 表示不禁用(數據立即發送,延遲低但帶寬消耗高)。
#yes 表示禁用(數據會合并成大包發送,帶寬低但延遲高)。replica-priority 100
#從節點的優先級(用于主從切換時選舉新主節點):
#值越小優先級越高(0 表示該從節點不能成為主節點)。lazyfree-lazy-eviction no
#內存滿時驅逐鍵(根據 maxmemory-policy)是否使用 “惰性刪除”(后臺異步刪除,不阻塞主線程):no 表示立即刪除(可能阻塞)。lazyfree-lazy-expire no
#鍵過期時是否使用惰性刪除:no 表示立即刪除(可能阻塞)。lazyfree-lazy-server-del no
#執行DEL命令刪除大量數據時是否使用惰性刪除:no 表示立即刪除(可能阻塞)。replica-lazy-flush no
#從節點同步主節點數據前,清空自身數據是否使用惰性刪除:no 表示立即清空(可能阻塞)。appendonly yes
#是否啟用 AOF(Append Only File)持久化:
#yes 表示啟用(記錄所有寫命令到 AOF 文件,用于恢復數據,比 RDB 更完整)。
#no 表示禁用(僅使用 RDB 持久化)。appendfilename "appendonly.aof"
#AOF 文件的名稱(默認appendonly.aof),存儲路徑由dir參數指定。no-appendfsync-on-rewrite no
#AOF 重寫期間是否禁用appendfsync(控制 AOF 文件刷盤策略):
#no 表示不禁用(每寫入命令都刷盤,保證數據安全,但影響性能)。
#yes 表示禁用(重寫期間不刷盤,提升性能,但可能丟失這段時間的數據)。auto-aof-rewrite-percentage 100
#AOF 自動重寫的觸發條件之一:當 AOF 文件大小超過 “上次重寫后大小” 的 100%(即翻倍)時,觸發重寫(重寫是為了壓縮 AOF 文件,去除冗余命令)。auto-aof-rewrite-min-size 64mb
#AOF 自動重寫的觸發條件之二:AOF 文件大小至少達到 64MB 時,才可能觸發重寫(避免小文件頻繁重寫)。aof-load-truncated yes
#當 AOF 文件末尾被截斷(如 Redis 崩潰導致),加載時是否繼續:
#yes 表示繼續加載(忽略截斷部分,記錄警告)。
#no 表示拒絕加載(需手動修復 AOF 文件)。aof-use-rdb-preamble yes
#是否啟用 “混合持久化”:yes 表示 AOF 文件開頭包含 RDB 格式數據,后續是增量 AOF 命令(結合 RDB 加載快和 AOF 數據完整的優點)。lua-time-limit 5000
#Lua 腳本的最大執行時間(單位:毫秒):超過 5000 毫秒(5 秒)的腳本會被強制終止,避免阻塞 Redis。slowlog-max-len 128
#慢查詢日志的最大條目數:記錄執行時間超過slowlog-log-slower-than(默認 10 毫秒)的命令,超過 128 條時會刪除最舊的條目。notify-keyspace-events ""
#鍵空間通知配置:空字符串表示禁用通知(不發送任何事件)。若需開啟(如鍵過期通知),可設置為特定字符(如"Ex"表示鍵過期事件)。hash-max-ziplist-entries 512
#哈希類型使用 “壓縮列表(ziplist)” 存儲的條件:當哈希的字段數≤512 時,用 ziplist(節省空間);否則轉為哈希表(hashtable)。hash-max-ziplist-value 64
#哈希類型使用 ziplist 的補充條件:每個字段和值的長度≤64 字節(否則轉為哈希表)。list-max-ziplist-size -2
#列表類型使用 ziplist 存儲的最大內存:-2 表示以字節為單位,值為 8KB(超過則轉為雙向鏈表 linkedlist)。list-compress-depth 0
#列表的壓縮深度:0 表示不壓縮任何節點;1 表示壓縮表頭和表尾各 1 個節點;2 表示各 2 個,以此類推(節省空間)。set-max-intset-entries 512
#集合類型使用 “整數集合(intset)” 存儲的條件:元素全為整數且數量≤512 時,用 intset(節省空間);否則轉為哈希表。zset-max-ziplist-entries 128
#有序集合使用 ziplist 存儲的條件:元素數≤128 時,用 ziplist;否則轉為跳表(skiplist)。zset-max-ziplist-value 64
#有序集合使用 ziplist 的補充條件:每個元素的成員(member)長度≤64 字節(否則轉為跳表)。hll-sparse-max-bytes 3000
#HyperLogLog 類型(用于基數統計)的稀疏表示最大字節數:超過 3000 字節時轉為稠密表示(平衡空間和性能)。stream-node-max-bytes 4096
#流(stream)類型中每個節點的最大字節數:超過 4096 字節時拆分節點(優化流的存儲和查詢)。stream-node-max-entries 100
#流類型中每個節點的最大條目數:超過 100 條時拆分節點。activerehashing yes
#是否啟用主動重哈希:yes 表示 Redis 定期對哈希表進行重哈希(優化哈希表性能,避免查詢效率下降)。hz 10
#Redis 內部定時任務的執行頻率(單位:赫茲):10 表示每秒執行 10 次,影響過期鍵刪除、客戶端超時檢測等(值越高,響應越及時,但 CPU 消耗越高)。dynamic-hz yes
#是否動態調整hz值:yes 表示 Redis 空閑時降低hz(節省 CPU),繁忙時提高hz(保證響應速度)。aof-rewrite-incremental-fsync yes
#AOF 重寫時是否啟用增量 fsync:yes 表示每寫入 32MB 數據就刷盤一次(避免大量數據同時刷盤導致延遲)。rdb-save-incremental-fsync yes
#RDB 保存時是否啟用增量 fsync:yes 表示每寫入 32MB 數據就刷盤一次(優化 RDB 持久化的性能)。
步驟 3:啟動 Redis 容器
bash
docker run -p 6379:6379 --name redis --restart=always \-v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf \-v /usr/local/redis/data:/data \-d redis redis-server /etc/redis/redis.conf \--appendonly yes --requirepass 123456
參數詳解:
--restart=always
:容器退出時自動重啟-v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf
:掛載主機配置文件到容器-v /urs/local/redis/data:/data
:掛載數據目錄,實現數據持久化redis-server /etc/redis/redis.conf
:指定使用掛載的配置文件啟動 Redis--appendonly yes --requirepass 123456
:開啟 AOF 持久化(--appendonly yes
?)、設置密碼(--requirepass 123456
?)
三、驗證 Redis 容器是否正常運行
1. 查看容器狀態
bash
# 查看容器運行狀態
docker ps | grep redis# 查看容器詳細日志
docker logs redis
如果看到類似Ready to accept connections
的日志,說明 Redis 啟動成功。
2. 連接 Redis 進行測試
bash
# 進入Redis容器
docker exec -it redis redis-cli# 輸入密碼(如果配置了密碼)
127.0.0.1:6379> AUTH 123456# 測試設置和獲取鍵值
127.0.0.1:6379> SET test "Hello Docker Redis"
OK
127.0.0.1:6379> GET test
"Hello Docker Redis"
四、Redis 容器管理常用命令
1. 基本操作
bash
# 啟動已停止的Redis容器
docker start redis# 停止運行中的Redis容器
docker stop redis# 重啟Redis容器
docker restart redis# 查看容器詳細信息
docker inspect redis
2. 配置文件更新
當需要修改 Redis 配置時,只需更新主機上的/usr/local/redis/conf/redis.conf
文件,然后重啟容器即可:
bash
# 編輯配置文件
vi /usr/local/redis/conf/redis.conf# 重啟容器使配置生效
docker restart redis
3. 升級 Redis 版本
bash
# 停止并刪除當前容器(數據已持久化到主機,不會丟失)
docker stop redis
docker rm redis# 拉取新版本鏡像
docker pull redis:latest# 使用相同命令啟動新容器
docker run -d \--name redis \--restart=always \-p 6379:6379 \-v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf \-v /usr/local/redis/data:/data \redis:latest \redis-server /etc/redis/redis.conf
五、安全最佳實踐
- 設置強密碼:務必在配置文件中通過
requirepass
設置復雜密碼 - 限制網絡訪問:生產環境建議通過
bind
參數限制允許連接的 IP,或通過防火墻控制訪問 - 定期備份數據:雖然數據已持久化到主機,仍建議定期備份
/usr/redis/data
目錄 - 使用固定版本鏡像:生產環境避免使用
latest
標簽,應指定具體版本(如redis:7.2.4
) - 最小權限原則:運行容器時可考慮添加
--user
參數指定非 root 用戶運行
六、常見問題解決
1. 容器啟動后立即退出
檢查日志定位問題:
bash
docker logs redis
常見原因:配置文件錯誤、目錄權限不足(可嘗試chmod 777 /opt/redis/data
臨時測試)
2. 無法遠程連接 Redis
- 檢查主機防火墻是否開放 6379 端口
- 確認 Redis 配置中
protected-mode
已設為no
(或已正確配置bind
參數) - 檢查連接密碼是否正確
3. 數據持久化失敗
- 確認掛載目錄權限正確
- 檢查配置文件中
dir
參數是否指向/data
- 查看 Redis 日志中是否有持久化相關錯誤
總結
通過 Docker 安裝 Redis 可以極大簡化部署過程,同時保證環境一致性。本文介紹的方法既適用于開發測試環境,也可通過適當調整配置應用于生產環境。核心在于理解數據持久化的實現方式和容器與主機的交互機制,以便更好地管理和維護 Redis 服務。