You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同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请求。

解决办法

  1. 修正应用连接方式:修改app容器的代码或配置,使用Redis客户端库(而非HTTP客户端)连接Redis服务,端口指定为6379。
  2. 如需HTTP访问Redis:可在Redis容器前添加HTTP代理层,比如使用redis-rest-api这类镜像,将HTTP请求转换为Redis协议后转发给Redis服务。

内容的提问来源于stack exchange,提问作者Emeka Emmanuel Oziri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:04:57