docker容器訪問宿主機mysql資料庫
阿新 • • 發佈:2022-04-18
今天用docker部署一個web服務時遇到總是連不上宿主機mysql資料庫的問題,報SQLSTATE[HY000] [2002] Connection refused,經過測試,宿主機用相同配置可以連上,登入docker容器內就連不上,初步判斷容器內通過localhost或127.0.0.1是連不上宿主機的。具體原因和解決方法如下:
原因:
-
docker容器內的localhost並不是指宿主機的localhost
-
docker在執行時就建立了虛擬網絡卡,並命名為docker0,在宿主機ifconfig可以看到網橋的ip是172.17.0.1(不同機器或者docker版本ip可能不同,需要查下自己的是多少)
解決方法:
- 在容器內通過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
- 設定宿主機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]>
- 修改容器web服務的db ip配置即可