Docker Redis使用Unix套接字启动报错:Failed opening Unix socket: bind: Address in use
解决Redis容器Unix套接字绑定失败(Address in use)的问题
问题原因
你当前的配置直接将宿主机的/var/run/redis.sock文件挂载到容器内同一路径,会触发两种导致报错的情况:
- 宿主机不存在该文件时,Docker会自动创建一个普通文件,Redis尝试创建Unix套接字时,因路径已被普通文件占用而失败。
- 若之前容器启动过,宿主机残留了旧的套接字文件,Redis无法重复绑定该路径。
解决方案
步骤1:清理残留文件(若存在)
先删除宿主机上可能存在的redis.sock文件:
rm -f /var/run/redis.sock
步骤2:修改Docker Compose配置
不要直接挂载套接字文件,改为挂载目录,让Redis在容器内的目录中创建套接字。修改后的docker-compose.yml:
services: redis: command: ["redis-server", "/usr/local/etc/redis/redis.conf"] container_name: redis image: redis:alpine restart: unless-stopped volumes: - ./conf:/usr/local/etc/redis - ./redis-sock:/var/run/redis # 挂载目录而非文件 # 若使用命名卷替代绑定挂载,可添加以下部分(可选,更适合生产环境) # volumes: # redis-sock:
步骤3:更新Redis配置
修改./conf/redis.conf中的套接字路径,指向容器内的挂载目录:
unixsocket /var/run/redis/redis.sock unixsocketperm 777 # 根据需求调整权限,确保宿主机服务能访问套接字
步骤4:启动容器
重新启动容器即可:
docker-compose up -d
此时,宿主机的./redis-sock目录下会生成redis.sock套接字文件,其他服务直接通过./redis-sock/redis.sock路径即可连接Redis。
若使用命名卷,可通过以下命令查看套接字的宿主机路径:
docker volume inspect redis-sock
输出中的Mountpoint字段即为宿主机上的套接字所在目录。
内容的提问来源于stack exchange,提问作者Ricky Sixx
相关产品推荐
相关产品推荐

