docker端口映射及虚拟机挂起重开无法远程访问的理解
关于端口映射:
在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因为没有端口。用个数据流便于理解:
假设我们要访问mysql,那么数据流的流向是这样的
数据流:外部数据——>主机:3306——>docker:3306
当然端口可以任意关系映射,docker的端口是mysql对外开放的端口即可
虚拟机挂起重开无法远程访问mysql
关于这个问题,我们可以回到数据流的模型,这时我们发现一个问题,这里就涉及到一个数据包转发的知识。
出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
这里有一个问题,就是既然禁止数据包转发,那么每次容器重新启动为什么就能正确连上?这是因为在启动的时候触发了临时生效此种的配置方式,而在系统重启,或对系统的网络服务进行重启后都会失效。
虚拟机的挂起,相当于物理机中的休眠,会将内存中的数据全部存放到对应的休眠文件中,占用的空间为内存大小,并且会对虚拟机执行关机操作。休眠后的虚拟机不占任何CPU、内存。挂起激活读取了内存文件,但系统是相当于重启了,所以临时生效的配置方式就因此失效。
想要完全解决这个问题,可以修改 /etc/sysconfig/network配置文件,添加FORWARD_IPV4=YES,然后service netwrok restart重启激活
当然这个问题实际上也不是什么大问题,重启下docker就可以解决了,但这后面设计到的知识确实不少,值得需要记录下