如何在远程Docker上运行Testcontainers?连接超时问题求助
解决远程Docker服务器上启动Testcontainers容器的连接超时问题
你遇到的System.Net.Sockets.SocketException (10060)是连接超时错误,核心原因是你的代码无法连接到远程服务器的Docker API端口。下面是具体的排查和解决步骤:
1. 先验证基础网络连通性
在本地机器上执行以下命令,确认远程服务器的165.12.3.15:9563端口是否可达:
- 用telnet:
telnet 165.12.3.15 9563 - 用curl:
curl http://165.12.3.15:9563/version
如果命令执行失败,说明网络或端口配置存在问题,优先解决这个。
2. 配置远程Docker开放TCP API端口
Docker默认仅监听本地Unix套接字,不会对外暴露TCP端口,需要修改配置开启:
- 编辑Docker配置文件:
- Linux系统:
/etc/docker/daemon.json - Windows Docker Desktop:
C:\ProgramData\Docker\config\daemon.json(或通过桌面设置的"Daemon"标签修改)
- Linux系统:
- 添加如下配置(如果文件已有内容,合并
hosts字段):{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:9563"] }0.0.0.0表示监听所有网卡,也可以指定远程服务器的具体IP。 - 重启Docker服务:
- Linux:
sudo systemctl restart docker - Windows:重启Docker Desktop
- Linux:
3. 开放防火墙/安全组规则
- 远程服务器本地防火墙要允许9563端口的TCP流量:
- Linux(ufw):
sudo ufw allow 9563/tcp - 云服务器(阿里云/腾讯云等):在安全组控制台添加入站规则,允许TCP 9563端口的访问。
- Linux(ufw):
- 确保本地机器到远程服务器的网络没有中间防火墙拦截该端口。
4. 修正Testcontainers代码的细节
- 你的代码中调用
testContainer.StartAsync()没有等待异步操作完成,这可能导致后续逻辑出错,应该使用await:
注意:构造函数不能是异步的,建议把初始化逻辑放到异步方法中调用。public async Task InitializeAsync() { MsSqlTestcontainer testContainer = new TestcontainersBuilder<MsSqlTestcontainer>() .WithDatabase(new MsSqlTestcontainerConfiguration { Password = "localdevpassword#123" }) .WithDockerEndpoint("tcp://165.12.3.15:9563") .WithImage("mcr.microsoft.com/mssql/server") .WithCleanUp(true) .Build(); await testContainer.StartAsync(); } - 如果远程Docker启用了TLS认证,需要添加TLS配置:
.WithDockerEndpoint("tcp://165.12.3.15:9563") .WithDockerAuthConfig(new DockerAuthConfig { Tls = true, CaCertPath = "/path/to/ca.pem", ClientCertPath = "/path/to/cert.pem", ClientKeyPath = "/path/to/key.pem" })
5. 验证配置有效性
完成上述步骤后,再次用curl http://165.12.3.15:9563/version测试,若能返回Docker版本的JSON数据,说明API端口配置正常,此时运行你的Testcontainers代码即可正常连接远程Docker。
内容的提问来源于stack exchange,提问作者Hamid Noahdi
相关产品推荐
相关产品推荐

