networking - docker 撰写 : Mock external services

标签 networking docker

我有以下情况:

我的应用程序由一个调用
外部 API(例如,一些 SaaS 服务、ElasticSearch 等)。出于非单元测试的目的,我们希望控制外部服务,然后还要注入(inject)故障。应用程序和“模拟”API 是 dockerized 和
现在我想使用 docker-compose旋转所有容器。

因为应用程序有几个硬编码的地址(例如外部服务的主机名),我无法更改它们并且需要解决。
service容器调用 http://external-service.com/getsomestuff .

我的想法是使用 docker 提供的一些功能将所有传出流量重新路由到外部 http://external-service.com/getsomestuff到模拟容器而不更改 URL。

我的 docker-compose.yaml好像:

version: '2'
services:
  service:
    build: ./service
    container_name: my-service1
    ports:
      - "5000:5000"
    command: /bin/sh -c "python3 app.py"

  api:
    build: ./api-mock
    container_name: my-api-mock
    ports:
      - "5001:5000"
    command: /bin/sh -c "python3 app.py"

最后,我有一个驱动程序,它只执行以下操作:
curl -XGET localhost:5000/
curl -XPUT localhost:5001/configure?delay=10
curl -XGET localhost:5000/

第二个curl只需将模拟中的延迟设置为 10 秒。

我考虑过几种选择:
  • 使用 iptables -fu(需要修改 Dockerfile 来安装它)
  • 使用 docker 网络(我真的不清楚)

  • 有什么简单的选择可以实现我想要的吗?

    编辑:

    为清楚起见,这里是 service 的相关部分代码:
    import requests
    
    @app.route('/')
    def do_stuff():
        r = requests.get('http://external-service.com/getsomestuff')
        return process_api_response(r.text())
    

    最佳答案

    Docker 为用户定义的网络运行一个内部 DNS 服务器。任何未知的主机查找都将转发到您的普通 DNS 服务器。

    版本 2+ compose 文件将自动创建一个网络供 compose 使用,因此有多种方法可以控制它解析的主机名。

    最简单的方法是使用主机名命名容器:

    version: "2"
    services:
      external-service.com:
        image: busybox
        command: sleep 100
      ping:
        image: busybox
        command: ping external-service.com
        depends_on:
          - external-service.com
    

    如果要保留容器名称,可以使用 links
    version: "2"
    services:
      api:
        image: busybox
        command: sleep 100
      ping:
        image: busybox
        links:
          - api:external-service.com
        command: ping external-service.com
        depends_on:
          - api
    

    或网aliases
    version: "2"
    services:
      api:
        image: busybox
        command: sleep 100
        networks:
          pingnet:
            aliases:
            - external-service.com
      ping:
        image: busybox
        command: ping external-service.com
        depends_on:
          - api
        networks:
          - pingnet
    networks:
      pingnet:
    

    关于networking - docker 撰写 : Mock external services,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42964666/

    相关文章:

    android - 如何在android中处理网络请求

    c# - 如何 : Prevent Timeout When Inspecting Unavailable Network Share - C#

    python - 带有 asyncio 的 UDP 服务器

    java - 通过代理网络(如果可用)重定向所有 Android 应用程序网络(使用库)

    docker - 如何在Mesosphere中创建容器类型为Docker的Pod?

    docker - 如何在本地主机上获取 docker 镜像的图层

    docker - 为什么Docker CLI命令默认为控制容器?

    c++ - 从网络队列中读取多个数据报

    linux - 如何在 docker-machine 中保存对 boot2docker 的更改?

    laravel - 服务 'certbot' 无法构建 : manifest for phusion/baseimage:latest not found: manifest unknown: manifest unknown