如何在docker compose中禁用外部网络调用?

问题描述 投票:0回答:1

我正在针对大型遗留服务运行一组测试,该遗留服务(目前)通过Internet对其他服务进行外部网络调用。

该项目的目标是像在同一docker-compose网络中的其他Docker容器一样模拟这些外部服务。其中一些服务是我们组织运行的微服务,其他是第三方供应商。

我们正在记录外部调用,以识别此服务正在调用哪些外部端点,并相应地模拟这些调用。但是,因为我要把它放在CI中,并且该服务在大型组织中有很多贡献者,所以我想通过将整个docker-compose网络与Internet隔离开来来强制要求不调用任何外部服务。

关闭wifi的快捷方式,如何在允许同一个docker网络中的服务相互通信的同时,禁用这些服务的外部呼叫?

这里给出的选项:https://docs.docker.com/network/#network-drivers似乎不是我想要的。

我们使用CircleCI,因此如果该配置中有解决方案,那就很好。我只是也没有在那些文档中找到与之相关的任何东西,并且希望使用docker-compose解决方案,以便可以在本地进行测试。

docker networking docker-compose circleci
1个回答
0
投票

您可以使用iptables之类的东西来限制来自主机端的连接。但是,如果您只需要docker-compose文件中的内容,这是一个主意。

如果您想将其与通过域名访问的资源隔离开,您可以给它一个伪造的DNS,这样它就无法解析主机。这是一个测试,证明了这个概念。

docker-compose.yaml

version: '3'

services:
  service1:
    image: alpine
    command: sh -c 'ping service2 -c 1; ping google.com -c 1'
    dns: 0.0.0.0
  service2:
    image: alpine
    command: sh -c 'ping service1 -c 1; ping google.com -c 1'
    dns: 0.0.0.0
isolated> docker-compose up
Recreating isolated_service1_1 ... done                                                                                 Recreating isolated_service2_1 ... done                                                                                 Attaching to isolated_service2_1, isolated_service1_1
service1_1  | PING service2 (172.18.0.2) 56(84) bytes of data.
service1_1  | 64 bytes from isolated_service2_1.isolated_default (172.18.0.2): icmp_seq=1 ttl=64 time=0.038 ms
service1_1  |
service1_1  | --- service2 ping statistics ---
service1_1  | 1 packets transmitted, 1 received, 0% packet loss, time 0ms
service1_1  | rtt min/avg/max/mdev = 0.038/0.038/0.038/0.000 ms
service2_1  | PING service1 (172.18.0.3) 56(84) bytes of data.
service2_1  | 64 bytes from isolated_service1_1.isolated_default (172.18.0.3): icmp_seq=1 ttl=64 time=0.093 ms
service2_1  |
service2_1  | --- service1 ping statistics ---
service2_1  | 1 packets transmitted, 1 received, 0% packet loss, time 0ms
service2_1  | rtt min/avg/max/mdev = 0.093/0.093/0.093/0.000 ms
service1_1  | ping: google.com: Temporary failure in name resolution
service2_1  | ping: google.com: Temporary failure in name resolution
isolated_service1_1 exited with code 2
isolated_service2_1 exited with code 2

您可以看到这些容器可以互相ping通,但不能相互ping通外部域(google.com)。

一种更灵活的解决方案是创建单独的网络,如此答案https://stackoverflow.com/a/51964169/160256中所述。这确实具有无法公开端口的缺点。

© www.soinside.com 2019 - 2024. All rights reserved.