docker内部应用访问宿主机mysql和redis时被拒绝connection refuse

2026-04-13 12:442阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:

之前写过两篇docker踩坑日记

记录一个小坑:普通用户执行 Docker 提示没权限,最后发现是用户组问题 开发调优
今天装完 Docker 后,用当前普通用户执行 docker ps 发现没权限。 一开始还以为是服务没起来,后面查了下才发现是当前用户没进 docker 组。补了下面这条之后,重新登录就正常了: sudo usermod -aG docker $USER 这个坑虽然不大,但第一次碰到的时候还真容易往别的方向查。 不过也看到有人说 docker 组权限其实挺高的,所以想顺便请教一下,大家平时…

Docker踩坑日记 - 不要没事总想着更新!

今天继续记录一个实际例子

一、连接地址切记不能用localhost和127.0.0.1

这些地址代表的都是容器内的系统,根本没有访问到宿主机,会一直报连接mysql/redis异常。

二、用docker的虚拟网卡地址

在宿主机查询网卡情况------ifconfig
docker0这块虚拟网卡的 inet 地址就是正确的本地ip(如172.17.0.1)

所以打包时,例如java打包时,要将配置文件中的ip改成172.17.0.1,这样就能保证容器内部可以访问到宿主机了

三、关闭掉ubuntu防火墙

关掉是最简单粗暴的做法,另外可以使用iptables建立规则

四、更改mysql,redis配置

一般mysql,redis都会绑定本地ip,如果做测试或内网可以将这个配置注释掉

mysql如下 #bind-address = 127.0.0.1 #mysqlx-bind-address = 127.0.0.1 同时增加一个"%"不受ip限制的mysql用户,这样容器内就可以彻底访问到宿主mysql了

redis如下 #bind 127.0.0.1 ::1 protected-mode no 这样容器内就可以彻底访问到宿主redis了

从docker容器向宿主机访问的场景,应该比较少 更多就是测试下 ,如果一定要这么做,可以参考我这个帖子。

网友解答:
--【壹】--:

确实是这样的,只是好奇想试试,其实从里再向外访问确实挺别扭的


--【贰】--:

哈,感谢大佬提醒,太惊险了,暴露了好多秘密


--【叁】--:

我一般容器互访都是用容器名访问,不用暴露端口。
如果你mysql和redis不是docker部署就没试过这种。


--【肆】--:

还有就是用 host.docker.internal 访问宿主机网络,如果是 Linux 环境下就用下面的方式启用该网关域名。

services: example: extra_hosts: - "host.docker.internal:host-gateway"

Docker Documentation – 16 Mar 26

How-tos

Learn how to connect containers to the host, across containers, or through proxies and VPNs in Docker Desktop.


--【伍】--:

你把你的mysql和redis暴露在公网了


--【陆】--:

用 docker compose 不就好了,为什么要用外部的 redis


--【柒】--:

建共用bridge网络,然后用容器名访问就好了


--【捌】--:

我本地尝试下,感谢提供方法,我感觉从容器内部向外访问貌似很少用,只是想测试下