之前写过两篇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容器向宿主机访问的场景,应该比较少
更多就是测试下
,如果一定要这么做,可以参考我这个帖子。
Lindo (佬友记) 2
你把你的mysql和redis暴露在公网了
chuangshiji (chuangshiji) 3
哈,感谢大佬提醒,太惊险了,暴露了好多秘密 ![]()
用 docker compose 不就好了,为什么要用外部的 redis![]()
fimmy (fimmy) 5
建共用bridge网络,然后用容器名访问就好了
chuangshiji (chuangshiji) 6
我本地尝试下,感谢提供方法,我感觉从容器内部向外访问貌似很少用,只是想测试下
还有就是用 host.docker.internal 访问宿主机网络,如果是 Linux 环境下就用下面的方式启用该网关域名。
services:
example:
extra_hosts:
- "host.docker.internal:host-gateway"
fimmy (fimmy) 8
我一般容器互访都是用容器名访问,不用暴露端口。
如果你mysql和redis不是docker部署就没试过这种。
chuangshiji (chuangshiji) 9
确实是这样的,只是好奇想试试,其实从里再向外访问确实挺别扭的
![]()






















