Docker本地部署DynamoDB后Java客户端连接被拒绝求助
解决本地DynamoDB与Java客户端连接拒绝问题
针对你遇到的Connection refused错误,我整理了几个排查和解决方向,你可以一步步尝试:
1. 修正Docker启动命令的参数错误
你当前的启动命令最后是-sharedD,这是拼写错误,正确的参数应该是-sharedDb(少了字母b)。参数错误可能导致DynamoDB容器无法正常启动或监听端口,重新执行正确的启动命令:
docker run -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb
执行后用docker ps确认容器处于Up状态。
2. 验证宿主机8000端口是否被占用
如果宿主机的8000端口已经被其他程序占用,DynamoDB容器无法成功绑定该端口,会直接导致连接失败:
- Linux/macOS执行:
lsof -i :8000 - Windows执行:
netstat -ano | findstr :8000
如果有其他进程占用,要么停止该进程,要么把DynamoDB映射到其他端口(比如-p 8001:8000),同时修改Java客户端的端点为http://localhost:8001/。
3. 确认容器内部端口监听状态
即使容器显示Up,也可能内部没有正确监听8000端口。先获取容器ID:
docker ps
然后执行命令查看容器内端口监听情况:
docker exec <你的容器ID> netstat -tulpn
如果看不到0.0.0.0:8000的监听记录,说明DynamoDB服务没正常启动,建议删除容器重新运行正确的启动命令。
4. 调整Java客户端的凭证配置(可选但推荐)
本地DynamoDB不需要真实的AWS凭证,你当前使用的EnvironmentVariableCredentialsProvider如果没有配置环境变量,可能会引入额外潜在问题。可以替换为匿名凭证简化配置:
AmazonDynamoDB client = AmazonDynamoDBClientBuilder .standard() .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("dummy", "dummy"))) .withEndpointConfiguration( new AwsClientBuilder.EndpointConfiguration("http://localhost:8000/", "eu-central-1") ).build();
这样可以排除凭证相关干扰,专注解决连接问题。
5. 检查网络环境(如果Java应用也在Docker容器中)
如果你的Java客户端运行在另一个Docker容器里,localhost指的是容器自身而非宿主机,这种情况下需要:
- 把两个容器加入同一个Docker网络,然后用容器名称作为端点(比如
http://dynamodb-local:8000/) - 或者使用宿主机的局域网IP地址(比如
http://192.168.x.x:8000/,替换为你的实际IP) - Docker Desktop用户可以直接用
http://host.docker.internal:8000/作为端点
建议先从第1和第2步开始排查,这两个是最常见的问题根源。
内容的提问来源于stack exchange,提问作者user11475921
相关产品推荐
相关产品推荐

