Oracle虚拟机中host.docker.internal连接失败求助
核心问题分析
你在VirtualBox的CentOS7虚拟机中,通过host.docker.internal跨容器通信超时,本质是同一Docker Compose栈内的容器不需要通过宿主机端口映射通信,直接用服务名即可实现容器间网络互通。而host.docker.internal在CentOS7的Docker环境中可能存在解析或网络转发的额外问题。
快速修复方案(推荐)
直接利用Docker Compose的内置网络特性,通过服务名替代host.docker.internal:
修改环境文件:将
configuration-service.env中的配置改为anoymizer-host=http://dose-sheet-anonymizer-rs:6001(
dose-sheet-anonymizer-rs是你在docker-compose中定义的服务名,Docker会自动解析为对应容器的IP)简化docker-compose配置:移除两个服务的
extra_hosts字段(同一栈内容器默认在同一网络,无需额外配置),如果不需要外部访问6001端口,还可以去掉dose-sheet-anonymizer-rs的ports映射:services: configuration-service: image: configuration-service:latest restart: always env_file: configuration-service.env dose-sheet-anonymizer-rs: image: anonymizer-rs:latest restart: always # 若无需外部访问,可删除下方ports配置 ports: - "6001:6001"重启服务:
docker-compose down && docker-compose up -d
若坚持使用host.docker.internal的修复步骤
如果必须通过宿主机端口通信,需解决CentOS7环境下的host.docker.internal解析和网络问题:
检查Docker版本:确保Docker版本≥20.10(Linux上
host.docker.internal从该版本开始默认支持),查看版本:docker --version配置Docker daemon:若版本符合但仍有问题,编辑
/etc/docker/daemon.json(不存在则创建)添加以下内容:{ "experimental": true }重启Docker服务:
systemctl restart docker检查虚拟机防火墙:CentOS7的firewalld可能阻止了端口转发,临时关闭测试:
systemctl stop firewalld测试成功后,可永久开放6001端口:
firewall-cmd --add-port=6001/tcp --permanent firewall-cmd --reload验证解析:进入
configuration-service容器,检查host.docker.internal的解析:docker exec -it <configuration-service容器ID> ping host.docker.internal确保解析到CentOS7虚拟机的桥接IP,而非
172.17.0.1(Docker默认网桥网关)
验证方法
进入configuration-service容器,测试连通性:
docker exec -it $(docker-compose ps -q configuration-service) curl http://dose-sheet-anonymizer-rs:6001
(若用host.docker.internal方案,则替换为curl http://host.docker.internal:6001)
内容的提问来源于stack exchange,提问作者user2853467

