Docker撰写:模拟外部服务

我有以下情况:

我的应用程序由一个调用外部API的单个Web服务(比如某些SaaS服务,ElasticSearch等)组成。 对于非unit testing的目的,我们希望控制外部服务,之后还要注入错误。 应用程序和“模拟”的API是dockerized,现在我想用docker docker-compose来旋转所有的容器。

因为应用程序有几个硬编码的地址(例如外部服务的主机名),我不能改变它们,需要解决。

service容器打电话给http://external-service.com/getsomestuff

我的想法是使用docker提供的一些function,将所有外部stream量redirect到外部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(需要修改Dockerfiles来安装它)
  • 使用dockernetworking(这实在是不清楚)

有什么简单的select来实现我想要的吗?

编辑

为了清楚起见,以下是service代码的相关部分:

 import requests @app.route('/') def do_stuff(): r = requests.get('http://external-service.com/getsomestuff') return process_api_response(r.text()) 

Docker为用户定义的networking运行一个内部的DNS服务器。 任何未知的主机查找都会转发给您正常的DNS服务器。

版本2+撰写文件将自动创build一个networking供撰写使用,所以有很多方法来控制它解决的主机名。

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

 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 

或networking别名

 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: 

我不完全清楚你想要解决什么问题,但是如果你想让容器内的external-service.com service直接访问你的“模拟”服务,我认为你应该能够做到在docker docker-compose.yml文件中使用extra_hosts指令。 例如,如果我有这个:

 version: "2" services: example: image: myimage extra_hosts: - google.com:172.23.254.1 

这将导致容器中的/etc/hosts包含:

 172.23.254.1 google.com 

并尝试访问http://google.com将打我的web服务器在172.23.254.1。