首页  >  文章  >  后端开发  >  为什么我无法从外部连接到 Docker 容器内的 WebSocket 服务器?

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

Patricia Arquette
Patricia Arquette原创
2024-11-06 13:29:03490浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn