将 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 <name>
顺便检查一下你的主机端口是否已经在用户中:
sudo lsof -i tcp:8080
如果没有出现,则表示端口8080
尚未使用。万一已经在使用。在端口8080
上终止该进程:
sudo kill -9 your_PID_ID
然后再试一次
【讨论】:
感谢您的回答。由于主机中的套接字服务器在端口 8080 中运行,因此预计它正在使用中,我无法杀死它。因为这是我的客户端(在 docker 容器中)将连接到的端口。我会试试你的其他建议。谢谢 我试过这个 docker run -p 8080:777docker run -p 8080:80 <name>
。您的 8080 端口将启动并将该端口再次绑定到容器内的 80 端口...您现在的问题是 8080 主机端口已经在使用中,很明显。
或者你为什么不在你的机器上尝试另一个端口。像这样的一些端口:docker run -p 999:80 <name>
以上是关于将 docker 容器中的 websocket 客户端连接到主机中的 websocket 服务器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 laravel 应用程序中使用 docker 容器启动运行 websockets
Docker进阶与实战_帝都客_ pdf扫描版_完整版_资源免费下载
从 docker 容器和节点使用 websocket 的问题
通过 nginx 或 traefik 通过 html 网页访问 docker 容器 websocket?
跟着极客时间学习Elasticsearch-Docker容器运行Elasticsearch Kibana以及Cerebro