部署容器,服务访问时报: No route to host (Host unreachable)

一、现象

当部署好所有服务时,调接口,发现在开发环境能调通的,倒了测试环境不通。

然后查看日志:

2023-11-21T03:25:02.594741947Z feign.RetryableException: No route to host (Host unreachable) executing GET http://XXXXX/feign/XXX/XXXX/admin
2023-11-21T03:25:02.594767737Z  at feign.FeignException.errorExecuting(FeignException.java:213)
2023-11-21T03:25:02.594775227Z  at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:115)
2023-11-21T03:25:02.594783407Z  at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:80)

二、原因分析

首选觉得是防火墙的问题,检查防火墙

systemctl status firewalld

发现防火墙是开着的,于是关闭防火墙。但是不起作用。

仔细想了下,nacos是和应用不同服务器,但是可以正常启动服务。说明跟防火墙关系不大。

接着就开始使用在服务器内部直接调用请求:curl http://XXXXX/feign/XXX/XXXX/admin

如果容器内部没有curl命令可以通过以下方式安装相关基础命令:

# 1 、⾸先执⾏如下命令,更新相关资源
apt-get update
# 2 、安装 telnet
apt-get install telnet
# 3 、安装 curl
apt-get install curl
# 4 、安装 ifconfig
apt-get install net-tools
# 5 、安装 vim
apt-get install vim
# 6 、安装 ping
apt-get install inetutils-ping

是可以成功的。这就奇怪了。然后进入容器内部访问

docker exec -it 容器id  /bin/bash

然后接着调入curl http://XXXXX/feign/XXX/XXXX/admin 发现还是失败的。

此时调用的是服务器地址以及容器服务暴漏的端口。

然后curl:http://XXXXX/feign/XXX/XXXX/admin内部服务是可以通的。这里就可以知道是容器某个配置有问题。

我们是通过docker-compose配置各个应用的。

然后去查看配置:

容器配置了一个网络:

networks:

  szqc-network:

    name: ${NETWORK_NAME}

    ipam:

      config:

        - subnet: 172.23.0.0/16

然后每个应用配置

datadev-server:

    image: XXXX/szqc2023002/datadev-server:latest

    container_name: ${PROJECT_NAME}-${DATADEV_SERVER_NAME}

    restart: always

    deploy:

      restart_policy:

        delay: 10s

        max_attempts: 100

    networks:

      - ${NETWORK_NAME}

    ports:

      - "${DATADEV_SERVER_PORT}:8080"

    environment:

      SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}

      NACOS_ADDR: ${NACOS_ADDR}

      NACOS_PORT: ${NACOS_PORT}

      NACOS_USERNAME: ${NACOS_USERNAME}

      NACOS_PASSWORD: ${NACOS_PASSWORD}

      NACOS_DISCOVERY_ENABLED: ${NACOS_DISCOVERY_ENABLED}

      NACOS_DISCOVERY_NAMESPACE: ${NACOS_DISCOVERY_NAMESPACE}

      NACOS_CONFIG_ENABLED: ${NACOS_CONFIG_ENABLED}

      NACOS_CONFIG_NAMESPACE: ${NACOS_CONFIG_NAMESPACE}

    volumes:

      - ${DEPLOY_ROOT}/${WORKFLOW_NAME}/logs:/logs

    healthcheck:

      test: "curl --fail --silent localhost:8080/actuator/health | grep UP || exit 1"

      interval: 20s

      timeout: 5s

      retries: 5

      start_period: 40s

  open-api-develop:

    image: XXXX/open-api-develop:latest

    container_name: ${PROJECT_NAME}-${OPEN_API_DEVELOP_NAME}

    restart: always

    deploy:

      restart_policy:

        delay: 10s

        max_attempts: 100

    networks:

      - ${NETWORK_NAME}

    ports:

      - "${OPEN_API_DEVELOP_PORT}:8080"

    environment:

      SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}

      NACOS_ADDR: ${NACOS_ADDR}

      NACOS_PORT: ${NACOS_PORT}

      NACOS_USERNAME: ${NACOS_USERNAME}

      NACOS_PASSWORD: ${NACOS_PASSWORD}

      NACOS_DISCOVERY_ENABLED: ${NACOS_DISCOVERY_ENABLED}

      NACOS_DISCOVERY_NAMESPACE: ${NACOS_DISCOVERY_NAMESPACE}

      NACOS_CONFIG_ENABLED: ${NACOS_CONFIG_ENABLED}

      NACOS_CONFIG_NAMESPACE: ${NACOS_CONFIG_NAMESPACE}

    volumes:

      - ${DEPLOY_ROOT}/${WORKFLOW_NAME}/logs:/logs

    healthcheck:

      test: "curl --fail --silent localhost:8080/actuator/health | grep UP || exit 1"

      interval: 20s

      timeout: 5s

      retries: 5

      start_period: 40s

也就是每个应用配置:

    networks:

      - ${NETWORK_NAME}

这样的配置没有给容器内部固定的ip,相当于是随机的。

最后改了容器内部服务为固定ip

容器网络:

networks:

  szqc:

    name: szqc

    ipam:

      config:

        - subnet: 172.23.0.0/16

应用网络:

    networks:

      szqc:

        ipv4_address: 172.23.0.70

问题最终得到解决。

期间还发生了另一个问题,改变网络失败:Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait -t nat -I DOCKER -i br-779d9d282d08 -j RETURN: iptables: No chain/target/match by that name.
 (exit status 1))

问题解决:重启docker,  service docker restart

三、结果

这个是由于容器内部访问宿主机ip不通的表现。因此配置固定的ip是可以通的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值