Testcontainers通信异常:容器间连接被拒绝问题求助
解决Testcontainers中容器间无法连接S3Mock的问题
问题场景
你配置了两个同属一个Docker网络的Testcontainers容器:
- 第一个GenericContainer配置:
该容器启动正常且可被ping通。genericContainer .withImagePullPolicy(PullPolicy.alwaysPull()) .withExposedPorts(SPRING_BOOT_PORT) .withNetwork(NETWORK) .withAccessToHost(true); - 第二个S3Mock容器配置:
无法从第一个容器内连接或ping通该S3Mock容器,使用S3MockContainer(DockerImageName.parse("adobe/s3mock:2.4.13")) .withInitialBuckets(S3_BUCKET_NAME) .withNetwork(NETWORK);s3MockContainer.getHost() + getFirstMappedPort()的方式也无法建立连接。
解决方案
容器间在同一Docker网络内的访问逻辑与宿主机访问不同,不能依赖宿主机映射端口,需按以下步骤调整:
1. 给S3Mock容器设置网络别名
在S3Mock容器配置中添加固定网络别名,让同网络内的其他容器可以通过别名直接访问:
S3MockContainer s3MockContainer = new S3MockContainer(DockerImageName.parse("adobe/s3mock:2.4.13")) .withInitialBuckets(S3_BUCKET_NAME) .withNetwork(NETWORK) .withNetworkAliases("s3mock"); // 添加网络别名,作为容器间访问的主机名
2. 使用S3Mock容器内部端口访问
adobe/s3mock:2.4.13版本的内部默认端口为:
- HTTP:9090
- HTTPS:9191
第一个容器内的S3客户端需配置端点为http://s3mock:9090(或HTTPS的https://s3mock:9191),而非宿主机的映射端口。以AWS SDK为例:
AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://s3mock:9090", "us-east-1")) .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("test", "test"))) .enablePathStyleAccess() // S3Mock必须启用路径样式访问 .build();
3. 关键逻辑说明
getHost()返回宿主机IP、getFirstMappedPort()返回宿主机映射端口,这两个参数仅适用于宿主机访问容器的场景。- 同一Docker网络内的容器属于内网环境,直接通过容器别名/容器名+内部端口即可互通,无需经过宿主机端口映射。
- S3Mock镜像已默认暴露内部端口,无需额外配置
withExposedPorts。
内容的提问来源于stack exchange,提问作者user1555190
相关产品推荐
相关产品推荐

