首页 > 后端开发 > Golang > 正文

为什么我无法从外部连接到 Docker 容器内的 WebSocket 服务器?

Patricia Arquette
发布: 2024-11-06 13:29:03
原创
504 人浏览过

Why Can't I Connect to My WebSocket Server Inside a Docker Container from Outside?

对 WebSocket 服务器的 Docker 化进行故障排除

问题:

在以下情况下难以连接到在 Docker 容器中运行的 WebSocket 服务器从容器外部访问它。

服务器代码:

// server.go
func RootHandler(w http.ResponseWriter, r *http.Request) {
    ... (WebSocket handling code) ...
}
登录后复制

Dockerfile:

FROM golang:1.11.4-alpine3.8
... (Build and expose port commands) ...
登录后复制

预期行为:

从容器外部连接到 WebSocket 服务器应在客户端打印“已连接”。

实际错误:

客户端因错误而恐慌:“恐慌:读取 tcp [::1]:60328->[::1]:8000: 读取:连接已被对等方重置。”

原因:

服务器正在容器内侦听本地主机(127.0.0.1),无法从容器外部访问该主机。

解决方案:

要解决此问题,请将 server.go 中服务器的监听地址更改为“:8000”而不是“localhost:8000”。这样,服务器将侦听容器的所有 IP 地址。

// server.go
func RootHandler(w http.ResponseWriter, r *http.Request) {
    ... (WebSocket handling code) ...
}

// main()
server := http.Server{Addr: ":8000"}
... (Rest of server setup) ...
登录后复制

其他信息:

  • Docker 通过创建 iptables 规则来公开端口将流量转发到容器的 IP 地址。
  • Docker 容器通常会获取 docker0 网络接口内的 IP 地址。
  • 从容器外部连接时,流量会转发到容器的 IP 地址,这可能会导致与服务器的监听地址不匹配。

以上是为什么我无法从外部连接到 Docker 容器内的 WebSocket 服务器?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!