Docker容器内连接宿主机Mysql

今天用docker部署一个web服务时遇到总是连不上宿主机mysql数据库的问题,报SQLSTATE[HY000] [2002] Connection refused,经过测试,宿主机用相同配置可以连上,登入docker容器内就连不上,初步判断容器内通过localhost或127.0.0.1是连不上宿主机的。具体原因和解决方法如下:

原因:

1.docker容器内的localhost并不是指宿主机的localhost

2.docker在运行时就建立了虚拟网卡,并命名为docker0,在宿主机ifconfig可以看到网桥的ip是172.17.0.1(不同机器或者docker版本ip可能不同,需要查下自己的是多少)

$ ifconfig  
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:25:59:50:ef  txqueuelen 0  (Ethernet)
        RX packets 10801  bytes 17612256 (16.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10657  bytes 1168888 (1.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

解决方法:

1.在容器内通过172.17.0.1:3306访问宿主机的mysql

$ docker exec -it 8686d3dda02c /bin/sh
 $ mysql -ushowx -p --database showx -P3306 -h172.17.0.1  #可以看到连上了,只是ip没有访问授权
ERROR 1130 (HY000): Host '172.17.0.2' is not allowed to connect to this MySQL server

2.设置宿主机mysql允许docker0的虚拟网卡ip访问

# 宿主机mysql设置允许用户showx通过172.17.0.2访问showx数据库的任意表
$ mysql -uroot -p
 mysql>GRANT ALL PRIVILEGES ON showx.* TO 'showx'@'172.17.0.2' IDENTIFIED BY 'password' WITH GRANT OPTION; 
 mysql>flush privileges; 

# docker内测试docker0 ip链接
$ docker exec -it 8686d3dda02c /bin/sh
$ mysql -ushowx -p --database showx -P3306 -h172.17.0.1
MySQL [showx]>

3.修改容器web服务的db ip配置即可

yan 21.3.25

欢迎关注下方“非著名资深码农“公众号进行交流~

发表评论

邮箱地址不会被公开。