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

Posted quietguoguo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法连接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端口也是没有问题的

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

问题

但是想通过DBeaver这个软件从外部访问宿主机ip上的3306端口是却提示超时,telnet 宿主机的3306端口也是同样超时。这说明宿主机的3306端口并没暴露在外。

排查过程

1、关闭selinux

selinux很安全但是很多时候会造成一些不明所以的问题,所以建议关掉

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

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

怀疑可能是ipv6转发没有开启,解决方法如下

echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
sysctl -p

至此能遇到的问题大都处理完了。

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

以上是关于无法连接docker端口映射问题的解决的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器映射到宿主机只有tcp6没有tcp问题

Docker 端口映射问题

配置远程连接容器内镜像(映射容器内系统的22端口到宿主机上)

Docker-端口映射

docker常见问题

Docker-端口映射