簡體   English   中英

Docker Compose:模擬外部服務

[英]Docker Compose: Mock external services

我有以下情況:

我的應用程序包含一個調用外部API的Web服務(比如一些SaaS服務,ElasticSearch等)。 對於非單元測試目的,我們希望控制外部服務,然后還要注入故障。 應用程序和“模擬”API是docker化的,現在我想使用docker 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(需要修改Dockerfiles來安裝它)
  • 使用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+撰寫文件將自動創建一個網絡供撰寫使用,因此有許多方法可以控制它解析的主機名。

最簡單的方法是使用主機名命名容器:

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

或網絡別名

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直接流向你的“模擬”服務,我認為你應該可以做到在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將嘗試訪問我的網絡服務器172.23.254.1。

我能用-links來解決這個問題,有沒有辦法在docker-compose中做網絡?

版本:'3'

服務:

MOCK:
 image: api-mock:latest
 container_name: api-mock-container
 ports:
    - "8081:80"

api: 
 image: my-service1:latest
 links:
   - MOCK:external-service.com

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM