Docker容器与Windows宿主机双向TCP socket通信搭建问题咨询
容器内Socket客户端与宿主机Socket服务端通信方案
问题原因
你之前的操作混淆了Docker端口映射-p参数的使用场景:-p 宿主机端口:容器端口的作用是让Docker守护进程预先占用宿主机指定端口,将该端口收到的流量转发到容器对应端口,仅适用于容器内运行服务端、外部/宿主机作为客户端访问的场景。你当前场景是容器为客户端、宿主机为服务端,不需要做入站端口映射,所以预先绑定宿主机5997端口才会导致冲突。
正确配置步骤
- 第一步:启动容器时去掉端口映射参数,无需占用宿主机端口
常规启动命令为:
如果你的Docker版本较低,无法自动解析宿主机地址,可额外添加host映射参数:docker run -it --name ubuntu1 ubuntu /bin/bashdocker run -it --name ubuntu1 --add-host=host.docker.internal:host-gateway ubuntu /bin/bash - 第二步:配置宿主机Java Socket服务端
服务端监听地址设置为0.0.0.0(不要仅监听127.0.0.1,否则容器无法访问),监听端口设置为5997,正常启动服务端即可,不会再出现端口被占用的报错。 - 第三步:配置容器内Socket客户端
客户端连接的目标地址填写Docker Desktop内置的宿主机域名host.docker.internal,目标端口填写5997,即可正常与宿主机服务端建立TCP连接,实现双向通信。
可用性验证
容器内可先执行ping host.docker.internal验证网络连通性,也可通过telnet host.docker.internal 5997验证端口是否可访问。
内容的提问来源于stack exchange,提问作者Dhiman
相关产品推荐
相关产品推荐

