Docker環(huán)境中Redis連接三種場景的配置指南
所有操作前請備份 docker-compose.yml 和 .env 文件。
場景一:連接到 Ubuntu 物理機上的 Redis
適用情況:Redis 直接安裝在宿主機(獨立的 Ubuntu 物理機或虛擬機)上,Docker 運行在該宿主機上。
1. 檢查宿主機 Redis 配置
確保宿主機 Redis 允許 Docker 容器訪問(默認只監(jiān)聽 127.0.0.1):
# 查看監(jiān)聽地址 sudo netstat -tlnp | grep 6379
如果只顯示 127.0.0.1:6379,請修改 /etc/redis/redis.conf:
bind 0.0.0.0 # 允許所有連接 # 或 bind 127.0.0.1 172.17.0.1 # 僅允許 Docker 網(wǎng)橋
重啟 Redis:
sudo systemctl restart redis-server
2. 修改docker-compose.yml
2.1 刪除內(nèi)部 Redis 服務(wù)
找到文件中的 redis: 塊(約第 158 行),刪除或注釋。
2.2 刪除app服務(wù)中的 Redis 依賴
在 app 服務(wù)的 depends_on: 中刪除 redis: 條目。
2.3 修改app的環(huán)境變量
app:
environment:
# 將 REDIS_ADDR 改為宿主機 IP(Docker 網(wǎng)橋網(wǎng)關(guān))
- REDIS_ADDR=172.17.0.1:6379
# 如果宿主機 Redis 有密碼,確保 .env 中 REDIS_PASSWORD 正確
- REDIS_PASSWORD=${REDIS_PASSWORD}
- REDIS_DB=0說明:172.17.0.1 是 Docker 默認網(wǎng)橋的網(wǎng)關(guān)地址,始終指向宿主機。也可以使用宿主機的物理 IP(如 192.168.1.100),但可能因 DHCP 變化而不穩(wěn)定。
2.4 確保.env中的密碼匹配
REDIS_PASSWORD=your_redis_password
3. 重新部署
docker compose down docker compose up -d
4. 驗證
# 進入 app 容器測試(容器內(nèi)可能沒有 nc/redis-cli,可用 Python)
docker exec WeKnora-app python3 -c "import socket; s=socket.socket(); s.connect(('172.17.0.1',6379)); print('OK')"
場景二:連接到 WSL 環(huán)境中的 Redis 服務(wù)
適用情況:Docker 運行在 WSL2 的 Linux 發(fā)行版中,Redis 安裝在同一個 WSL 實例內(nèi)(作為宿主機)。
說明:在 WSL 環(huán)境中,Docker 容器與 WSL 宿主機共享內(nèi)核,但網(wǎng)絡(luò)棧是隔離的。容器訪問 WSL 宿主機的服務(wù)需要使用 WSL 實例的 IP 或 Docker 網(wǎng)關(guān) IP。
1. 檢查 WSL 中 Redis 的監(jiān)聽配置
WSL 中的 Redis 默認只監(jiān)聽 127.0.0.1,需要修改為監(jiān)聽 0.0.0.0 或至少 Docker 網(wǎng)橋 IP:
sudo vi /etc/redis/redis.conf
修改:
bind 0.0.0.0
重啟 Redis:
sudo systemctl restart redis-server
2. 修改docker-compose.yml
2.1 刪除內(nèi)部 Redis 服務(wù)及依賴(同場景一)
2.2 修改app環(huán)境變量
WSL 中有兩種可靠的地址:
| 地址 | 說明 |
|---|---|
172.17.0.1 | Docker 網(wǎng)橋網(wǎng)關(guān),始終可達 |
host.docker.internal | 需要 extra_hosts 支持(你的配置已添加) |
推薦使用 172.17.0.1:
app:
environment:
- REDIS_ADDR=172.17.0.1:6379
- REDIS_PASSWORD=${REDIS_PASSWORD}
- REDIS_DB=0如果希望使用 host.docker.internal(你的 extra_hosts 已配置),也可:
- REDIS_ADDR=host.docker.internal:6379
3. 重新部署并驗證
docker compose down docker compose up -d # 測試連通性 docker exec WeKnora-app sh -c "echo 'PING' | timeout 2 nc 172.17.0.1 6379"
場景三:連接到指定 Docker 容器中的 Redis 服務(wù)
適用情況:已有一個獨立的 Redis 容器(如 xiaozhi-esp32-server-redis),希望 WeKnora 共用。
1. 確認外部 Redis 容器信息
docker ps | grep redis
記下容器名(例如 xiaozhi-esp32-server-redis)及其密碼(通過查看啟動命令或進入容器獲取)。
2. 將外部 Redis 容器加入 WeKnora 的項目網(wǎng)絡(luò)
WeKnora 項目使用自定義網(wǎng)絡(luò) WeKnora-network(實際名稱可能帶項目前綴)。先查看實際網(wǎng)絡(luò)名:
docker network ls | grep WeKnora # 假設(shè)輸出:weknora-main_WeKnora-network
連接外部容器到該網(wǎng)絡(luò):
docker network connect weknora-main_WeKnora-network xiaozhi-esp32-server-redis
3. 修改docker-compose.yml
3.1 刪除內(nèi)部 Redis 服務(wù)及依賴(同前)
3.2 修改app環(huán)境變量
app:
environment:
- REDIS_ADDR=xiaozhi-esp32-server-redis:6379 # 使用容器名
- REDIS_PASSWORD=${REDIS_PASSWORD} # 必須與外部 Redis 密碼一致
- REDIS_DB=03.3 如果外部 Redis 有密碼,更新.env
REDIS_PASSWORD=external_redis_password
4. 重新部署并驗證
docker compose down
docker compose up -d
# 驗證 DNS 解析和連接
docker exec WeKnora-app ping -c 1 xiaozhi-esp32-server-redis
docker exec WeKnora-app python3 -c "import socket; s=socket.socket(); s.connect(('xiaozhi-esp32-server-redis',6379)); print('OK')"
通用注意事項
- 刪除內(nèi)部 Redis 后,
docker-compose.yml中redis:整個塊必須刪除或注釋,否則 Compose 仍會創(chuàng)建容器。 - 依賴關(guān)系:務(wù)必刪除
app服務(wù)的depends_on中的redis:條目,否則啟動時會等待不存在的服務(wù)。 - 密碼一致性:外部 Redis 如有密碼,
.env中的REDIS_PASSWORD必須完全一致(包括大小寫、特殊字符)。無密碼則留空:REDIS_PASSWORD=。 - 數(shù)據(jù)庫編號:通過
REDIS_DB選擇數(shù)據(jù)庫,默認為0。如果外部 Redis 的 DB0 已被其他應(yīng)用占用,可改為1,但需確保 WeKnora 支持。 - Langfuse 等可選服務(wù):如果啟用了
--profile langfuse或--profile full,langfuse-worker和langfuse-web也依賴 Redis,它們通過REDIS_CONNECTION_STRING連接,需要同步修改。如果未啟用,可忽略。 - 網(wǎng)絡(luò)穩(wěn)定性:
- 場景一、二中,宿主機 IP(
172.17.0.1)在 Docker 重啟后可能改變(極少見),建議使用host.docker.internal(需extra_hosts支持,你的配置已提供)。 - 場景三中,容器名解析依賴 Docker 內(nèi)置 DNS,只要容器在同一網(wǎng)絡(luò)即可。
- 場景一、二中,宿主機 IP(
- 安全建議:
- 避免將 Redis 暴露到公網(wǎng)。
- 生產(chǎn)環(huán)境務(wù)必設(shè)置強密碼,并考慮使用 Docker 網(wǎng)絡(luò)隔離。
附錄:快速比對表
| 場景 | REDIS_ADDR | 需要額外操作 | 驗證命令 |
|---|---|---|---|
| 物理機 Redis | 172.17.0.1:6379 或 宿主機IP | 修改 Redis 監(jiān)聽 0.0.0.0 | docker exec WeKnora-app python3 -c "import socket; socket.create_connection(('172.17.0.1',6379),2)" |
| WSL 中 Redis | 172.17.0.1:6379 或 host.docker.internal:6379 | 修改 Redis 監(jiān)聽 0.0.0.0 | 同上 |
| 外部 Redis 容器 | <容器名>:6379 | 將容器加入 WeKnora-network | docker exec WeKnora-app sh -c "echo PING | nc <容器名> 6379" |
以上就是Docker環(huán)境中Redis連接三種場景的配置指南的詳細內(nèi)容,更多關(guān)于Docker Redis連接的三種場景的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Dockerfile的使用及docker部署java項目實踐
Docker通過Dockerfile構(gòu)建自定義鏡像,簡化部署流程,主要指令包括FROM、RUN、CMD、ENTRYPOINT、ENV、ADD、COPY、VOLUME、WORKDIR和USER,構(gòu)建Java環(huán)境需準備目錄、Dockerfile、JDK和jar文件,執(zhí)行構(gòu)建命令并驗證部署2026-03-03
Docker 部署net5程序?qū)崿F(xiàn)跨平臺功能
本文講述使用docker容器部署.net5項目、實現(xiàn)跨平臺,本文通過圖文的形式給大家介紹了創(chuàng)建.net5項目的過程及安裝成功后如何使用docker部署項目,感興趣的朋友跟隨小編一起學(xué)習(xí)吧2021-05-05
docker配置skywalking 監(jiān)控springcloud應(yīng)用的詳細步驟
本文分步驟給大家講解docker配置skywalking 監(jiān)控springcloud應(yīng)用的方法,感興趣的朋友一起看看吧2025-04-04

