0

如何使用以下方法创建 docker 网络testcontainers

  • 允许网络中的所有容器与每个容器进行通信
  • 允许容器将端口映射到主机
  • 但不允许容器访问互联网

我曾尝试使用internal网络来做到这一点:

private Network generateInternalNetwork() {
     // Consumer which operates on the final CreateNetworkCmd which will be run to
     // make sure the 'internal' flag is set.
     Consumer<CreateNetworkCmd> cmdModifier = (createNetworkCmd) -> {
         createNetworkCmd.withInternal(true);
     };

     return Network.builder()
             .createNetworkCmdModifier(cmdModifier)
             .build();
}

但是,当我运行它时,我无法映射我的端口。抛出异常:

Caused by: java.lang.IllegalArgumentException: Requested port (8024) is not mapped

如果我在没有它的情况下运行它withInternal(true)可以正常工作,但容器当然可以访问互联网。

4

2 回答 2

1

我认为您可以通过(a)创建普通网络,然后(b)向防火墙链添加DROP规则来获得所需的内容:DOCKER-USER

iptables -I DOCKER-USER -j DROP

在我刚才的快速实验中,这让我从容器映射端口,但阻止容器访问互联网(因为这个链是从链中调用的FORWARD,它阻止容器通过主机将流量转发到外部互联网)。

于 2020-09-27T23:54:16.300 回答
0

在花了几天尝试不同的事情之后,我想出了一个可行的解决方案:

    /**
     * Set an invalid DNS for the given container.
     * This is done as a workaround so that the container cannot access
     * the internet.
     */
    void setInvalidDns() {
        GenericContainer<?> container = getContainer();
        Consumer<CreateContainerCmd> modifier = (cmd) -> {
                // Amend the config with the garbage DNS.
                String invalidDns = "255.255.255.255";
                HostConfig hostConfig = cmd.getHostConfig();
                hostConfig.withDns(invalidDns);
                cmd.withHostConfig(hostConfig);
        };

        container.withCreateContainerCmdModifier(modifier);
    }

这会将容器的 DNS 设置为无效 IP,然后当您尝试在容器中发出 HTTP 请求时,它会抛出java.net.ConnectException.

于 2020-10-07T21:16:26.130 回答