模拟任意端口上的传出 docker http 请求

问题描述 投票:0回答:1

我在docker中编写了一个依赖于其他服务的服务。但是,我很难对其进行测试,因为我无法自动执行任何验证 Docker 容器的传出流量的测试。

当我的服务收到请求时,它会进行一些数字处理。它应该将结果发送到另外两个服务。出于测试目的,我只需在本地启动一个模拟服务器,以验证它是否从我的 docker 容器收到了结果。

我目前执行此操作的方法是在 docker-compose 中指定

extra_hosts
,即:

extra_hosts:
  - some-web-service.some-domain:127.0.0.1

现在,由于这是

http
我只能在端口 80 上启动我的模拟服务?

如果我想启动多个不同的模拟服务,或者我已经在使用端口 80,该怎么办?

如何将容器的传出流量重定向到端口 1234?

简单来说,我希望能够做到这一点:

extra_hosts:
  - some-web-service.some-domain:127.0.0.1:1234
docker http networking docker-compose
1个回答
0
投票

不清楚模拟服务在哪里运行。你说的是本地 - 这可能意味着在与后台进程相同的容器中,作为 docker 中的另一个服务,或者在主机上。应用“127.0.0.1”的唯一方法是如果您将模拟服务作为容器中的后台进程运行。在容器的世界中,“127.0.0.1”指的是容器本身,而不是主机操作系统。

要访问在主机系统上运行的模拟服务,请将“host-gateway”替换为 127.0.0.1 - 此别名表示从容器桥接到主机的 IP。另外:由于此 IP 不是 127.0.0.1,因此模拟服务无法在本地主机上侦听 - 此桥上的流量不计为本地主机流量。

  extra_hosts:
   - some-web-service.some-domain:host-gateway

如果您无法将您的应用程序重定向到使用默认端口(80)以外的任何端口,那么桥接接口就是一个到您的主机的桥接器 - docker 无法进行任何端口重新映射。

在这种情况下,最好将模拟服务作为容器来运行。

services:
  service-to-test:
    ...
    depends_on:
    - mock1
    - mock2

  mock1:
    image: mock1:tag
    build:
      context: ./mock1
    networks:
      default:
        aliases: ["api1.example.com"]

  mock2:
    image: mock2:tag
    networks:
      default:
        aliases: ["api2.example.com"]

假设您可以对您的模拟进行 dockerize,这会将每个模拟的 dns 基础别名添加到被测服务所附加的默认网络,从而允许其连接到它们。确保它们正在侦听端口 80,因为 Docker 网络允许直接服务到服务通信,并且没有端口重新映射。

© www.soinside.com 2019 - 2024. All rights reserved.