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

Hyperledger Sawtooth Docker部署问题:客户端容器与REST API无连接

问题排查与解决方案

针对你遇到的客户端容器无法连接REST API,但主机可以正常连接的问题,以下是几个针对性的排查方向和解决办法:

1. 确认容器是否在同一Docker网络

Docker Compose启动Sawtooth服务时,会自动创建一个专属网络(默认名称为{当前目录名}_default)。如果你的客户端容器不是通过同一个Compose文件启动的,或者启动时没有指定加入这个网络,就会出现容器间无法通信的情况:

  • 查看rest-api容器所属网络:
    docker inspect sawtooth-rest-api-default | grep -A 10 "Networks"
    
  • 查看客户端容器所属网络:
    docker inspect <你的客户端容器名> | grep -A 10 "Networks"
    
  • 如果两者网络不同,将客户端容器加入Sawtooth的网络:
    docker network connect <Sawtooth网络名称> <客户端容器名>
    
    或者启动客户端容器时指定网络:
    docker run -it --network <Sawtooth网络名称> <客户端镜像> /bin/bash
    

2. 修改REST API的绑定地址

你的rest-api容器entrypoint中使用了--bind rest-api:8008,这会让REST API仅监听容器自身hostname对应的IP。虽然同一网络内应该能解析,但偶尔会出现解析异常。可以修改为绑定所有网卡:

  • 编辑sawtooth-default.yaml,将rest-api的entrypoint改为:
    entrypoint: sawtooth-rest-api -C tcp://validator:4004 --bind 0.0.0.0:8008
    
  • 重启rest-api容器:
    docker-compose -f sawtooth-default.yaml restart rest-api
    
    之后再进入客户端容器执行curl http://rest-api:8008/blocks测试。

3. 测试容器间的DNS解析

先确认客户端容器能否解析到rest-api容器的IP:

  • 进入客户端容器,执行:
    ping rest-api
    
    如果无法ping通,尝试用容器全名解析:
    ping sawtooth-rest-api-default
    
    如果全名能解析,说明服务名rest-api的DNS映射有问题,此时可以改用容器全名访问:
    curl http://sawtooth-rest-api-default:8008/blocks
    

4. 检查Ubuntu防火墙规则

Ubuntu的ufw防火墙可能会拦截容器间的流量,即使主机能正常访问:

  • 临时关闭ufw测试:
    sudo ufw disable
    
    如果关闭后客户端能正常连接,需要配置ufw允许Docker容器间的流量,或者添加规则允许8008端口的容器间通信。

5. 确认客户端容器的网络模式

如果启动客户端容器时使用了--network host模式,容器会共享主机网络,此时rest-api:8008无法解析,需要改用主机的localhost访问:

curl http://localhost:8008/blocks

内容的提问来源于stack exchange,提问作者smarn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:45:45