使用镜像创建了容器:
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
问题来了:
宿主机和容器互相可以ping通,但是telnet测试tcp连接却不行,比如在宿主机上执行:
显示无法连接。
请问有大神们碰到过这种情况吗?应该怎么解决。
打开了固定的端口,按理来说就可以通过端口连接的。(防火墙已经关闭)
接受TCP/UDP连接需要服务器。socket是需要被监听的。
是一个分布式的系统,开始会在容器中打开一个进程监听12345端口,再从宿主机中启动另一个进程通过12345端口进行连接。
会在容器中首先打开一个进程监听12345端口,再从宿主机中启动另一个进程通过12345端口进行连接。
我在容器中用telnet ip 端口连外面可以,但是从宿主机使用 telnet ip 端口 到宿主机,一直显示连接被拒绝。
你这个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连接,宿主机这边就是卡主。容器内也没反应。
容器内:
宿主机:
两边都是卡在这无输出。
正常来说,用两台不同物理机连接是会有进一步输出的。
没有反应的可能原因太多了,网络只是其中之一。先用 --network host
测试一下确认是网络问题再去折腾它,不要凭空猜测。
不要用-p
参数,用--network host
,然后使用localhost连接容器,如果还是没反应那就跟网络没关系。