如何使用 docker 公开 envoy?

How to expose envoy using docker?

我在 docker 中有微服务容器 运行。我想将 Envoy 设置为多个 API 的单一网关。在我的 docker-compose.yml 中,我定义了一个服务 personapi 并且以下部分定义了网关:

  apigateway:
    image: ${DOCKER_REGISTRY-}apigateway
    build:
      context: .
      dockerfile: src/envoy/Dockerfile
    ports:
      - "7999:10000"
    depends_on:
      - personapi

还有一个 envoy.yaml 文件,它被复制到网关映像并包含以下内容:

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 127.0.0.1, port_value: 9901 }

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 127.0.0.1, port_value: 10000 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: some_service }
          http_filters:
          - name: envoy.filters.http.router
  clusters:
  - name: some_service
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: some_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: personapi
                port_value: 80

当我打开网关服务的控制台时,这两个命令起作用了:

  1. 连接人员服务,直接下载人员名单
curl personapi/person
  1. 连接到 envoy 并使用它路由到个人服务
curl localhost:10000/person

现在在主机上,当我尝试连接到端口 7999 上的网关服务时(在 docker compose 中指定映射到 apigateway 端口 10000)我得到一个空的响应 - 甚至没有状态码。好像有什么东西在听,但它拒绝回答任何请求。

如何向主机公开 Envoy 运行 docker?

它在 addresssocket_address

更新后开始工作
# this works:
socket_address: { address: 0.0.0.0, port_value: 10000 }

# this did not:
socket_address: { address: 127.0.0.1, port_value: 10000 }

您 运行 在此处遇到的问题并非特定于 docker,而是网络接口的工作方式。

在不起作用的那个中,您将 Envoy 侦听器绑定到 127.0.0.1。这是 loopback interface,您只能从 运行 所在的同一台机器上调用它。在此示例中,您需要 docker exec 进入容器才能调用此接口。

在有效的那个中,您绑定到 0.0.0.0,这是 IPV4 表示“我将接受来自任何地方的连接”的方式。该绑定使您可以从 Docker 容器外部处理 Envoy 侦听器。