防止直接调用托管在 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最全教程——从理论到实战

使用 Docker Compose 的微服务:同一个容器,多个项目

Docker最全教程——从理论到实战

针对docker中的服务进行集成测试

docker镜像中的微服务怎么访问宿主机上的oracle数据库呢

【容器】关于docker容器中的init进程