
本文详解 docker 容器内使用 jedis 连接宿主机 redis 时常见的“failed to connect to any host resolved for dns name”错误,重点说明网络模式选择、ip 地址配置及最佳实践。
本文详解 docker 容器内使用 jedis 连接宿主机 redis 时常见的“failed to connect to any host resolved for dns name”错误,重点说明网络模式选择、ip 地址配置及最佳实践。
在 Docker 容器中访问宿主机运行的 Redis(如本地开发环境中的 redis-server),常因网络隔离导致连接失败。你遇到的异常 Failed to connect to any host resolved for DNS name 并非 DNS 解析问题本身,而是容器无法路由到宿主机的 Redis 实例——根本原因在于默认的桥接(bridge)网络下,容器无法直接通过 localhost 或宿主机真实 IP(如 192.168.x.x)访问宿主机服务。
✅ 正确方案:使用 --network host 模式
Docker 的 host 网络模式使容器共享宿主机的网络命名空间,此时容器内 localhost 即指向宿主机,Redis 默认端口 6379 可直接访问:
docker build -t my-app . docker run --network host my-app
⚠️ 注意:--network host 在 macOS 和 Windows 上不支持(Docker Desktop 通过虚拟机实现,无真正 host 网络)。此时应改用特殊 DNS 名 host.docker.internal(Docker Desktop 自动注入)。
? 适配多平台的健壮写法
修改你的 Java 启动逻辑,优先尝试 host.docker.internal,回退至 localhost:
String host = args.length > 0 ? args[0] : "host.docker.internal"; int port = args.length > 1 ? Integer.parseInt(args[1]) : 6379; HostAndPort config = new HostAndPort(host, port); PooledConnectionProvider provider = new PooledConnectionProvider(config); UnifiedJedis client = new UnifiedJedis(provider);
对应 Dockerfile 中的 CMD 改为(避免硬编码 IP):
CMD ["java", "-jar", "app.jar"]
然后运行时无需传参:
# Linux(支持 host 网络) docker run --network host my-app # macOS/Windows(使用默认 bridge + host.docker.internal) docker run my-app
? 常见误区与规避
- ❌ 不要将宿主机局域网 IP(如 192.168.1.100)写入容器启动参数:该地址在 bridge 网络中不可达;
- ❌ 避免在容器内用 localhost 指向宿主机 Redis(bridge 模式下 localhost 是容器自身);
- ✅ 若需暴露 Redis 给容器且保持隔离,推荐将 Redis 也容器化并用 docker-compose 统一编排,通过服务名通信。
✅ 总结
| 场景 | 推荐方案 | 备注 |
|---|---|---|
| Linux 宿主机部署 | docker run --network host | 最简高效,端口直通 |
| macOS / Windows 开发 | 使用 host.docker.internal | Docker Desktop 自动解析 |
| 生产环境 | Redis 独立容器 + Docker Compose | 符合微服务原则,网络可控 |
通过合理选择网络模式与连接地址,即可彻底解决 Jedis 在 Docker 中连接宿主机 Redis 的典型网络障碍。


















