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。