将 docker 容器中的 websocket 客户端连接到主机中的 websocket 服务器

Posted

技术标签:

【中文标题】将 docker 容器中的 websocket 客户端连接到主机中的 websocket 服务器【英文标题】:Connect a websocket client in a docker container to a websocket server in host 【发布时间】:2018-08-30 03:25:20 【问题描述】:

我的主机中运行着一个 websocket 服务器,监听 8080 端口。 在一个 docker 容器中,我部署了一个 websocket 客户端,使用这个 sn-p 监听所述服务器:

connect_url="ws://0.0.0.0:80/"

并且,将容器的 80 端口暴露/映射到主机的 8080 端口。

Dockerfile:

EXPOSE 80

当我运行容器时:

docker run -p 8080:80 <name>

但是我收到了这个错误:

docker:来自守护进程的错误响应:驱动程序在端点上编程外部连接失败:启动用户态代理时出错:绑定 0.0.0.0:8080 失败:端口已分配。

现在我认为这个错误是因为主机中的服务器已经在使用8080端口,这就是它无法映射的原因。

有了这些细节,我只想知道我的 docker 容器内的 websocket 客户端如何连接到主机中的 websocket 服务器

【问题讨论】:

你是对的,端口已经绑定到你的服务器了。与其向主机打开容器的端口 (80),不如执行相反的操作。最好的方法是使用--net=host 运行容器,它直接与容器共享主机的网络。 我会试试你提到的 --net=host。谢谢 我已经尝试过 --net=host。但是socket无法连接到8080端口。我也把connect_url改成了ws://0.0.0.0:8080/ 是的,很抱歉,您需要在客户端上使用8080 来匹配主机的端口。你试过127.0.0.1而不是0.0.0.0吗? 我尝试了 127.0.01,但仍然没有运气。我在 EXPOSE 8080 存在且不在 Docker 文件中时尝试过 【参考方案1】:

我认为问题是容器内的端口 80 已经在使用,而不是主机上的 8080。尝试在 docker 容器内使用另一个端口连接套接字,而不是 80(例如 777 端口)。然后运行docker run -p 8080:777 &lt;name&gt;

顺便检查一下你的主机端口是否已经在用户中: sudo lsof -i tcp:8080 如果没有出现,则表示端口8080 尚未使用。万一已经在使用。在端口8080 上终止该进程: sudo kill -9 your_PID_ID 然后再试一次

【讨论】:

感谢您的回答。由于主机中的套接字服务器在端口 8080 中运行,因此预计它正在使用中,我无法杀死它。因为这是我的客户端(在 docker 容器中)将连接到的端口。我会试试你的其他建议。谢谢 我试过这个 docker run -p 8080:777 。同样的错误。端口已在使用中 当你运行docker run -p 8080:80 &lt;name&gt;。您的 8080 端口将启动并将该端口再次绑定到容器内的 80 端口...您现在的问题是 8080 主机端口已经在使用中,很明显。 或者你为什么不在你的机器上尝试另一个端口。像这样的一些端口:docker run -p 999:80 &lt;name&gt;

以上是关于将 docker 容器中的 websocket 客户端连接到主机中的 websocket 服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 应用程序中使用 docker 容器启动运行 websockets

Docker进阶与实战_帝都客_ pdf扫描版_完整版_资源免费下载

从 docker 容器和节点使用 websocket 的问题

通过 nginx 或 traefik 通过 html 网页访问 docker 容器 websocket?

跟着极客时间学习Elasticsearch-Docker容器运行Elasticsearch Kibana以及Cerebro

一种新的进入容器的方式: WebSocket + Docker Remote API