防止直接调用托管在 docker 容器中的微服务的最佳方法

Best way to prevent direct calls to a microservice hosted in a docker container

我有一个简单的概念验证系统,它有 2 个 API:一个用作网关,另一个是微服务。我已经为两者创建了 docker 容器,并使用 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
    ports:
      - 7501:7501
    networks:
      - api-local

networks:
  api-local:
    external: true

我可以打电话给 localhost:7500/some_url,我会得到回复。我也可以调用 localhost:7501/some_url,我也会收到回复。但是,我想阻止客户端直接调用 7501 微服务。我希望所有流量仅通过网关。

我可以过滤微服务中的 IP,如果不是来自网关 IP,则拒绝连接,但我想知道是否有更好的方法。

您可以尽量不要在 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 服务的端口映射。