防止直接调用托管在 docker 容器中的微服务的最佳方法
Posted
技术标签:
【中文标题】防止直接调用托管在 docker 容器中的微服务的最佳方法【英文标题】:Best way to prevent direct calls to a microservice hosted in a docker container 【发布时间】:2022-01-20 17:53:10 【问题描述】:我有一个简单的概念验证系统,它有 2 个 API:一个充当网关,另一个充当微服务。我已经为两者创建了 docker 容器并使用 docker compose 文件一起运行它们。
一切正常,除了我不确定如何限制微服务被直接调用。
这是我的撰写文件:
version: '3.4'
services:
apigateway:
image: apigateway
container_name: api-gateway
build:
context: .
dockerfile: api_gateway/Dockerfile
ports:
- 7500:7500
networks:
- api-local
apiadmin:
image: apiadmin
container_name: api-admin
build:
context: .
dockerfile: api_admin/Dockerfile
ports:
- 7501:7501
networks:
- api-local
networks:
api-local:
external: true
我可以调用 localhost:7500/some_url 并得到回复。我也可以调用 localhost:7501/some_url 并且我也得到了响应。但是,我想阻止客户端直接调用 7501 微服务。我希望所有流量只通过网关。
如果不是来自网关 IP,我可以过滤微服务中的 IP 并拒绝连接,但我想知道是否有更好的方法。
【问题讨论】:
不要发布端口。同一网络中的容器可以在没有发布端口的情况下进行通信。如果它们不在同一个网络中,那么发布的端口甚至会出现问题,因为默认情况下 localhost 的概念是不够的。每个容器都是它自己的本地主机。 【参考方案1】:您可以尝试不要在 docker-compose 文件中将微服务端口暴露给主机,它应该仍然可以在 docker 网络中访问并且可以被网关访问:
version: '3.4'
services:
apigateway:
image: apigateway
container_name: api-gateway
build:
context: .
dockerfile: api_gateway/Dockerfile
ports:
- 7500:7500
networks:
- api-local
apiadmin:
image: apiadmin
container_name: api-admin
build:
context: .
dockerfile: api_admin/Dockerfile
networks:
- api-local
networks:
api-local:
external: true
请注意,我删除了apiadmin
服务的端口映射。
【讨论】:
以上是关于防止直接调用托管在 docker 容器中的微服务的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
使用 Docker Compose 的微服务:同一个容器,多个项目