实测有效!一台服务器上同时启动Dify和Ragflow时,redis容器冲突解决方法。
我在同一台机器上同时启动 Ragflow 和 Dify 时,出现了 Redis 容器冲突的问题。表现为:当两个服务都启动后,其中一个服务的 Redis 容器会被删除,导致该服务无法正常访问。此外,在 Dify 的 Docker 目录下执行 docker compose down
时,会删除 Ragflow 的 Redis 容器。
问题原因:
起初,我怀疑是端口冲突或容器名称冲突导致的问题。然而,经过进一步排查,发现根本原因在于 Docker Compose 未指定项目名称。
Docker Compose 使用 项目名称 来隔离不同的项目环境。
默认情况下,项目名称是 docker-compose.yml
文件所在目录的名称。由于 Ragflow 和 Dify 的 docker-compose.yml
文件都位于各自项目目录的 docker/
目录下,导致两个服务的容器未能被有效隔离,从而引发冲突。
解决方案:
ragflow 基础docker服务启动方式不变。
dify启动时候要通过 -p
参数显式指定项目名称!!!
详细步骤:
拿我自己举例。
ragflow我是源码启动的,启动基础服务这一步就还是在docker目录下运行:
docker compose -f docker-compose-base.yml up -d
dify我是docker部署的,直接在docker文件夹下运行:
docker compose -p dify_docker up -d
这样两个项目的相关docker服务应该就都启动成功了。
关于端口会不会冲突的问题:
成功后使用
docker ps -a --format "table {{.Names}} {{.Status}} {{.Ports}}" | grep redis
查看这两个容器状态输出如下:
-
dify_docker-redis-1
容器只暴露了容器内部的 6379 端口,但没有映射到主机端口(6379/tcp
表示仅容器内部使用)。 -
ragflow-redis
容器将容器内部的 6379 端口映射到了主机的 6379 端口。
ragflow-redis
占用了主机的 6379 端口,那么其他容器不能再映射到主机的 6379 端口,但 dify_docker-redis-1
没有映射到主机端口,因此不会冲突。