问题描述
我们有一个依赖于第 3 方 API 的应用程序,我们需要在构建过程中对其进行模拟。我们想为此使用 Mock Server,因为它使我们可以很好地控制响应。
我们使用的 API 无法覆盖 URL,因此我们需要模拟 DNS 级别的依赖关系,迫使 domain.com 解析到我们的容器。幸运的是,我们可以使用 docker 轻松完成此操作,如下面的 docker-compose.yml 文件所示。
version: "2"
services:
mockserver:
image: mockserver/mockserver
ports:
- 80:1080
ping:
image: busyBox
links:
- mockserver:domain.com
- mockserver:api.domain.com
command: ping domain.com
depends_on:
- mockserver
如果我们运行 docker-compose run ping
,我们可以看到来自容器的对 domain.com 请求的响应
Creating docker-test_ping_run ... done
PING domain.com (172.22.0.2): 56 data bytes
64 bytes from 172.22.0.2: seq=0 ttl=64 time=0.081 ms
64 bytes from 172.22.0.2: seq=1 ttl=64 time=0.078 ms
64 bytes from 172.22.0.2: seq=2 ttl=64 time=0.125 ms
我们也可以访问模拟服务器的 Web UI http://localhost/mockserver/dashboard
但是,如果我尝试直接从 ping 容器内部访问模拟服务器,则它不支持端口转发。
❯ docker-compose exec ping sh
/ # wget domain.com
Connecting to domain.com (172.22.0.2:80)
wget: can't connect to remote host (172.22.0.2): Connection refused
/ # wget domain.com:1080
Connecting to domain.com:1080 (172.23.0.2:1080)
saving to 'index.html'
这里缺少什么?我们需要能够让 domain.com 请求在没有端口的情况下运行,否则我们无法交换我们的依赖项。
谢谢。
解决方法
原来我只是缺少 serverPort 设置,80:80 转发使 Web 界面保持正常工作。
version: "2"
services:
mockserver:
image: mockserver/mockserver
command: -serverPort 80
ports:
- 80:80
ping:
image: busybox
links:
- mockserver:domain.com
- mockserver:api.domain.com
command: ping domain.com
depends_on:
- mockserver