同一Docker Compose中容器间服务无端口指定通信的实现与疑问
同一Docker Compose容器间无需指定端口发送HTTP请求的方法
在Docker Compose环境中,容器间无需指定端口即可通信的核心逻辑是内部网络与自动DNS解析:
- Docker Compose会默认给所有服务创建专属的内部桥接网络,同一网络内的容器可直接通过服务名称互相访问,完全不需要依赖宿主机的端口映射。
- 如果目标服务在容器内监听的是HTTP默认端口80(或HTTPS默认443),发送请求时直接用
http://服务名称即可;如果容器内服务用的是非默认端口,只需在请求地址后加上容器内部的端口(比如http://服务名称:5000),和宿主机映射的端口毫无关系。
针对你的配置疑问解答
你的basket.api能直接用http://discount.grpc访问discount.grpc服务,原因有两点:
- 内部DNS解析生效:Docker Compose自动为
discount.grpc服务创建了DNS记录,basket.api容器里的请求http://discount.grpc会被直接解析到discount.grpc容器的内部IP,根本不需要用宿主机IP或端口。 - 容器内部服务监听默认端口:你在
ports里配置的8003:432只是宿主机端口和容器端口的映射,不影响容器内部的服务监听端口。你的discount.grpc服务在容器内实际监听的是HTTP默认的80端口(ASP.NET Core gRPC模板默认配置),所以basket.api用不带端口的地址就能正常访问。
至于你修改grpc服务端口后仍能正常请求,大概率是你修改的是宿主机的映射端口(比如把8003改成其他值),而容器内部的服务依然监听80端口,所以basket.api的请求地址不需要改动。如果要修改容器内部的服务端口,需要在discount.grpc的环境变量中添加ASPNETCORE_URLS=http://+:自定义端口,同时将basket.api的GrpcSettings:DiscountUrl改成http://discount.grpc:自定义端口才能正常通信。
内容的提问来源于stack exchange,提问作者shriram
相关产品推荐
相关产品推荐

