docker内部应用访问宿主机mysql和redis时被拒绝connection refuse
- 内容介绍
- 文章标签
- 相关推荐
之前写过两篇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"
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网络,然后用容器名访问就好了
--【捌】--:
我本地尝试下,感谢提供方法,我感觉从容器内部向外访问貌似很少用,只是想测试下
之前写过两篇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"
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网络,然后用容器名访问就好了
--【捌】--:
我本地尝试下,感谢提供方法,我感觉从容器内部向外访问貌似很少用,只是想测试下

