2

我正在尝试使用测试容器模拟网络中断。我想使用 Socat 容器来暴露端口,然后将其击落,然后再次向上。我无法做到这一点,因为没有停止。

我该如何管理?

4

2 回答 2

2

这很容易!

您需要 2 个容器,SocatContainer(由 Testcontainers 提供)和您的目标容器。将它们(Socat 和目标)与网络连接,请参见此处的示例:
https ://github.com/testcontainers/testcontainers-java/blob/bcecd5cd9f9325517fd45db585312df2624315bb/core/src/test/java/org/testcontainers/containers/NetworkTest.java

当您需要模拟中断时,只需断开您的目标与网络的连接(通过使用您通过DockerClientFactory.instance().client()和获得的 Docker 客户端disconnectFromNetworkCmd)。

在您确认正确处理了中断后,使用connectToNetworkCmd) 将您的目标连接到网络。

另一种解决方案是使用 Shopify 的 Toxiproxy:
https ://github.com/shopify/toxiproxy 。在容器中启动它(当然是使用 Testcontainers ;))并使用他们的 Java 客户端应用混沌操作。

于 2019-01-10T19:10:52.170 回答
1

最简单的方法是通过 testcontainers 支持 toxiproxy ( https://www.testcontainers.org/modules/toxiproxy/ )。

从上面的网页复制粘贴:

E.g. // Create a common docker network so that containers can communicate
@Rule
public Network network = Network.newNetwork();

// the target container - this could be anything
@Rule
public GenericContainer redis = new GenericContainer("redis:5.0.4")
    .withExposedPorts(6379)
    .withNetwork(network);

// Toxiproxy container, which will be used as a TCP proxy
@Rule
public ToxiproxyContainer toxiproxy = new ToxiproxyContainer()
    .withNetwork(network);
// To simulate an outage you do:

final ToxiproxyContainer.ContainerProxy proxy = toxiproxy.getProxy(redis, 6379);
proxy.setConnectionCut(true);
于 2019-11-10T10:59:47.007 回答