无法连接docker端口映射问题的解决

【无法连接docker端口映射问题的解决】当筵意气临九霄,星离雨散不终朝。这篇文章主要讲述无法连接docker端口映射问题的解决相关的知识,希望能为你提供帮助。
启动mysql容器
为方便开发,在测试机上用docker开启了一个mysql,并通过端口映射的方法,将容器内的3306 33060端口映射到宿主机的3306 33060端口上。

docker  run  --name  mysql  -p  3306:3306  -p  33060:33060  -e  MYSQL_ROOT_PASSWORD=123456  -d  mysql:5.7.38

使用docker port命令可以看到端口映射成功
docker  port  mysql

33060/tcp  ->   0.0.0.0:33060
3306/tcp  ->   0.0.0.0:3306

在宿主机上直接telnet 本机的3306端口也是没有问题的

问题
但是想通过DBeaver这个软件从外部访问宿主机ip上的3306端口是却提示超时,telnet 宿主机的3306端口也是同样超时。这说明宿主机的3306端口并没暴露在外。
排查过程
1、关闭selinuxselinux很安全但是很多时候会造成一些不明所以的问题,所以建议关掉
sed  -i  s/SELINUX=enforcing/SELINUX=disabled/g  /etc/selinux/config

2、防火墙拦截一般情况下都是是用iptables更多,所以firewalld就直接关闭了
systemctl    stop  firewalld
systemctl  disable  firewalld

3、iptables注意,在生产环境下,iptables要小心操作以免造成安全风险,而且由于docker的端口映射也是通过iptables来实现的,所以直接清空iptables也会带来一定问题。建议在docker正式上线前就执行清理操作系统自带的规则影响操作。如果没能力折腾,最简单的办法就是先清空,然后重启docker,在启动容器
iptables  -F
service  docker  restart
docker  start  mysql    #  因为在前文启动这个容器的时候没有加restart参数,所以需要手动启动

4、sysctl配置如果此时网络还是不通就需要查看一下网络端口使用情况,
可以看到docker容器的端口都是在ipv6下的。
netstate  -ntpl


怀疑可能是ipv6转发没有开启,解决方法如下
echo  "net.ipv6.conf.all.forwarding=1"  > >   /etc/sysctl.conf
sysctl  -p

至此能遇到的问题大都处理完了。
另外ipv4也同样需要开启转发,但是这个如果么有配置的话,docker在启动过程中会直接抛出错误,应该能直接观察到,所以这里就不写了。

    推荐阅读