同Docker自定义桥接网络下容器可Ping通但HTTP请求失败的原因
问题描述
我有两个运行在同一自定义Docker桥接网络(mynetwork)中的容器,它们能够解析彼此的主机名,且ping功能正常,但从app容器向redis容器发起HTTP请求时,连接被拒绝或超时。
我的docker-compose.yml配置如下:
services: app: build: . container_name: app networks: - mynetwork ports: - "8000:8000" redis: image: redis:alpine container_name: redis networks: - mynetwork networks: mynetwork: driver: bridge
在app容器内执行ping redis可正常连通。
已尝试的操作:
- 通过
docker network inspect mynetwork确认两个容器在同一网络 - 使用
docker exec -it redis redis-cli ping验证Redis容器内服务正常运行(返回PONG) - 尝试直接使用容器IP而非主机名发起请求,结果相同
- 重启两个容器
环境信息:
- Docker版本24.0.5
- docker-compose版本2.20.2
- 主机操作系统:Ubuntu 22.04
请问为何同一Docker桥接网络中的容器可Ping通,但HTTP/TCP请求会失败?
排查分析与解决方案
核心原因
Redis是键值数据库,默认仅监听TCP端口6379提供Redis专属协议服务,并不支持HTTP协议。用HTTP请求访问Redis容器,必然会被拒绝或超时——因为Redis容器内根本没有运行HTTP服务来处理这类请求。
验证方法
在app容器内执行以下命令,可确认Redis的TCP端口是连通的:
telnet redis 6379 # 或 nc -zv redis 6379
但如果尝试用HTTP客户端访问http://redis:6379,会收到连接拒绝或超时,因为该端口不响应HTTP请求。
解决办法
- 修正应用连接方式:修改app容器的代码或配置,使用Redis客户端库(而非HTTP客户端)连接Redis服务,端口指定为6379。
- 如需HTTP访问Redis:可在Redis容器前添加HTTP代理层,比如使用
redis-rest-api这类镜像,将HTTP请求转换为Redis协议后转发给Redis服务。
内容的提问来源于stack exchange,提问作者Emeka Emmanuel Oziri
相关产品推荐
相关产品推荐

