一、现象
当部署好所有服务时,调接口,发现在开发环境能调通的,倒了测试环境不通。
然后查看日志:
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命令可以通过以下方式安装相关基础命令:
是可以成功的。这就奇怪了。然后进入容器内部访问
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是可以通的。