无法连接Docker内的MySQL和Redis但可连接宿主机CentOS的MySQL,如何排查?
Docker部署MySQL、Redis无法连接问题排查方案
首先确认连接参数配置
你的Docker容器端口映射规则如下:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3a345949f38a redis "docker-entrypoint.s…" 20 hours ago Up 5 seconds 0.0.0.0:6380->6379/tcp, :::6380->6379/tcp redis b4189630fe88 mysql:5.7 "docker-entrypoint.s…" 30 hours ago Up 45 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql连接时需注意:
- 连接Docker内MySQL:主机填宿主机IP
172.16.33.5,端口填3307,不要用默认的3306,你测试3306端口访问的是宿主机本地部署的MySQL服务 - 连接Docker内Redis:主机填宿主机IP
172.16.33.5,端口填6380,不要用默认的6379 - 不要用
localhost作为连接主机,会走本地套接字默认访问宿主机本地服务,不会走Docker端口映射
- 连接Docker内MySQL:主机填宿主机IP
排查防火墙和SELinux拦截
CentOS系统默认的firewalld和SELinux大概率会拦截外部对Docker映射端口的访问,先临时关闭测试:# 临时关闭firewalld systemctl stop firewalld # 临时关闭SELinux setenforce 0测试连接正常后,再把对应端口加入防火墙白名单永久生效:
firewall-cmd --add-port=3307/tcp --permanent firewall-cmd --add-port=6380/tcp --permanent firewall-cmd --reload # 重新开启firewalld systemctl start firewalld宿主机本地先做连通性测试
先在宿主机本地执行命令测试,排除网络链路问题:# 测试Docker MySQL连通性,输入密码后看是否能正常登录 mysql -h172.16.33.5 -P3307 -uroot -p # 测试Docker Redis连通性 redis-cli -h172.16.33.5 -p6380如果宿主机本地可以正常连接,外部设备无法连接,说明问题出在局域网防火墙或者宿主机防火墙配置;如果宿主机本地也无法连接,查看容器日志排查内部配置问题:
# 查看MySQL容器运行日志 docker logs mysql # 查看Redis容器运行日志 docker logs redis排查Docker网桥转发规则
如果上述步骤都无效,检查iptables的FORWARD链规则是否拦截了Docker网桥的流量:# 查看FORWARD链默认策略 iptables -L FORWARD -n如果默认策略是DROP,执行以下命令放行Docker网段流量:
iptables -A FORWARD -s 172.17.0.0/16 -j ACCEPT iptables -A FORWARD -d 172.17.0.0/16 -j ACCEPT
内容的提问来源于stack exchange,提问作者arutoria
相关产品推荐
相关产品推荐

