关于docker容器与宿主机之间的连接问题

使用镜像创建了容器:
sudo docker run --gpus all --privileged=true -p 12345:12345 -p 12346:12346 -dit --name reality_q q:source /bin/bash
创建成功后进入容器:
docker exec -it (ID) /bin/bash

随后执行ifconfig,容器的ip为:172.17.0.2
image

问题来了:
宿主机和容器互相可以ping通,但是telnet测试tcp连接却不行,比如在宿主机上执行:
image

显示无法连接。

请问有大神们碰到过这种情况吗?应该怎么解决。
打开了固定的端口,按理来说就可以通过端口连接的。(防火墙已经关闭)

12345 里面有服务么?

接受TCP/UDP连接需要服务器。socket是需要被监听的。

是一个分布式的系统,开始会在容器中打开一个进程监听12345端口,再从宿主机中启动另一个进程通过12345端口进行连接。

会在容器中首先打开一个进程监听12345端口,再从宿主机中启动另一个进程通过12345端口进行连接。

你先进容器里确认端口正常再测试从宿主机连

1 个赞

我在容器中用telnet ip 端口连外面可以,但是从宿主机使用 telnet ip 端口 到宿主机,一直显示连接被拒绝。 :sob:

你这个172的地址是docker创建的容器隔离环境的网络地址,又没有绑定在宿主机上,设置了端口转发,直接访问宿主机的相应端口就行了,你这个在宿主机上直接访问127.0.0.1:12345就行了。

docker默认的网络是隔离的,你要是嫌端口转发很不方便,直接设置–network host,绑定宿主机的网络,就和在宿主机本地操作一个效果了

谢谢您的回复。就是现在我是想实现一个分布式的项目,比如需要在容器启动一个tcp进程,监听12345端口,然后在宿主机通过 (容器IP):端口 的方式进行连接。就是一直没反应。

上面已经说的很清楚了,如果你通过-p的方式转发端口,在宿主机上访问容器内的12345端口,只需要访问127.0.0.1:12345就可以了,-p端口映射会把容器内的端口绑定到宿主机的所有接口上。

docker默认创建了docker0网桥来连通容器和主机,如果你不了解docker的网络设置,就不要用容器的ip直接连接容器。

至于为什么在容器内部总是能够访问宿主机,那是因为docker0网桥默认会把容器内的流量直接转发到宿主机。

是的,哥。但是我在宿主机内访问127.0.0.1:122(重新建了个容器)还是和容器内的建立不了tcp连接,宿主机这边就是卡主。容器内也没反应。

容器内:
image
宿主机:


两边都是卡在这无输出。

正常来说,用两台不同物理机连接是会有进一步输出的。

没有反应的可能原因太多了,网络只是其中之一。先用 --network host 测试一下确认是网络问题再去折腾它,不要凭空猜测。

不要用-p参数,用--network host ,然后使用localhost连接容器,如果还是没反应那就跟网络没关系。

还是没反应 :sob: :sob: :sob: :sob:
image