Docker環(huán)境中Redis連接三種場景的配置指南
所有操作前請(qǐng)備份 docker-compose.yml 和 .env 文件。
場景一:連接到 Ubuntu 物理機(jī)上的 Redis
適用情況:Redis 直接安裝在宿主機(jī)(獨(dú)立的 Ubuntu 物理機(jī)或虛擬機(jī))上,Docker 運(yùn)行在該宿主機(jī)上。
1. 檢查宿主機(jī) Redis 配置
確保宿主機(jī) Redis 允許 Docker 容器訪問(默認(rèn)只監(jiān)聽 127.0.0.1):
# 查看監(jiān)聽地址 sudo netstat -tlnp | grep 6379
如果只顯示 127.0.0.1:6379,請(qǐng)修改 /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 改為宿主機(jī) IP(Docker 網(wǎng)橋網(wǎng)關(guān))
- REDIS_ADDR=172.17.0.1:6379
# 如果宿主機(jī) Redis 有密碼,確保 .env 中 REDIS_PASSWORD 正確
- REDIS_PASSWORD=${REDIS_PASSWORD}
- REDIS_DB=0說明:172.17.0.1 是 Docker 默認(rèn)網(wǎng)橋的網(wǎng)關(guān)地址,始終指向宿主機(jī)。也可以使用宿主機(jī)的物理 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. 驗(yàn)證
# 進(jìn)入 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 運(yùn)行在 WSL2 的 Linux 發(fā)行版中,Redis 安裝在同一個(gè) WSL 實(shí)例內(nèi)(作為宿主機(jī))。
說明:在 WSL 環(huán)境中,Docker 容器與 WSL 宿主機(jī)共享內(nèi)核,但網(wǎng)絡(luò)棧是隔離的。容器訪問 WSL 宿主機(jī)的服務(wù)需要使用 WSL 實(shí)例的 IP 或 Docker 網(wǎng)關(guān) IP。
1. 檢查 WSL 中 Redis 的監(jiān)聽配置
WSL 中的 Redis 默認(rèn)只監(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),始終可達(dá) |
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. 重新部署并驗(yàn)證
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ù)
適用情況:已有一個(gè)獨(dú)立的 Redis 容器(如 xiaozhi-esp32-server-redis),希望 WeKnora 共用。
1. 確認(rèn)外部 Redis 容器信息
docker ps | grep redis
記下容器名(例如 xiaozhi-esp32-server-redis)及其密碼(通過查看啟動(dòng)命令或進(jìn)入容器獲?。?/p>
2. 將外部 Redis 容器加入 WeKnora 的項(xiàng)目網(wǎng)絡(luò)
WeKnora 項(xiàng)目使用自定義網(wǎng)絡(luò) WeKnora-network(實(shí)際名稱可能帶項(xiàng)目前綴)。先查看實(shí)際網(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. 重新部署并驗(yàn)證
docker compose down
docker compose up -d
# 驗(yàn)證 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')"
通用注意事項(xiàng)
- 刪除內(nèi)部 Redis 后,
docker-compose.yml中redis:整個(gè)塊必須刪除或注釋,否則 Compose 仍會(huì)創(chuàng)建容器。 - 依賴關(guān)系:務(wù)必刪除
app服務(wù)的depends_on中的redis:條目,否則啟動(dòng)時(shí)會(huì)等待不存在的服務(wù)。 - 密碼一致性:外部 Redis 如有密碼,
.env中的REDIS_PASSWORD必須完全一致(包括大小寫、特殊字符)。無密碼則留空:REDIS_PASSWORD=。 - 數(shù)據(jù)庫編號(hào):通過
REDIS_DB選擇數(shù)據(jù)庫,默認(rèn)為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)定性:
- 場景一、二中,宿主機(jī) IP(
172.17.0.1)在 Docker 重啟后可能改變(極少見),建議使用host.docker.internal(需extra_hosts支持,你的配置已提供)。 - 場景三中,容器名解析依賴 Docker 內(nèi)置 DNS,只要容器在同一網(wǎng)絡(luò)即可。
- 場景一、二中,宿主機(jī) IP(
- 安全建議:
- 避免將 Redis 暴露到公網(wǎng)。
- 生產(chǎn)環(huán)境務(wù)必設(shè)置強(qiáng)密碼,并考慮使用 Docker 網(wǎng)絡(luò)隔離。
附錄:快速比對(duì)表
| 場景 | REDIS_ADDR | 需要額外操作 | 驗(yàn)證命令 |
|---|---|---|---|
| 物理機(jī) Redis | 172.17.0.1:6379 或 宿主機(jī)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連接三種場景的配置指南的詳細(xì)內(nèi)容,更多關(guān)于Docker Redis連接的三種場景的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Dockerfile的使用及docker部署java項(xiàng)目實(shí)踐
Docker通過Dockerfile構(gòu)建自定義鏡像,簡化部署流程,主要指令包括FROM、RUN、CMD、ENTRYPOINT、ENV、ADD、COPY、VOLUME、WORKDIR和USER,構(gòu)建Java環(huán)境需準(zhǔn)備目錄、Dockerfile、JDK和jar文件,執(zhí)行構(gòu)建命令并驗(yàn)證部署2026-03-03
Docker 部署net5程序?qū)崿F(xiàn)跨平臺(tái)功能
本文講述使用docker容器部署.net5項(xiàng)目、實(shí)現(xiàn)跨平臺(tái),本文通過圖文的形式給大家介紹了創(chuàng)建.net5項(xiàng)目的過程及安裝成功后如何使用docker部署項(xiàng)目,感興趣的朋友跟隨小編一起學(xué)習(xí)吧2021-05-05
docker配置skywalking 監(jiān)控springcloud應(yīng)用的詳細(xì)步驟
本文分步驟給大家講解docker配置skywalking 監(jiān)控springcloud應(yīng)用的方法,感興趣的朋友一起看看吧2025-04-04
Docker刪除某個(gè)鏡像的實(shí)現(xiàn)方法
在使用 Docker 時(shí),經(jīng)常需要?jiǎng)h除不再需要的鏡像、容器和卷,以釋放存儲(chǔ)空間,本文主要介紹了Docker刪除某個(gè)鏡像的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02

