我有两个环境:我的本地计算机Mac和VPS上的linux。问题是我无法使用localhost从VPS连接到我的数据库。 在我的本地计算机上,一切正常。
本地:
mysql -u root mydb -h 127.0.0.1 --password=password --port=2345 //OK
mysql -u root mydb -h 0.0.0.0 --password=password --port=2345 //OK
mysql -u root mydb -h localhost --password=password --port=2345 //OK
即使使用VPS的公共IP,我也可以从本地计算机连接到远程数据库。
VPS:
mysql -u root mydb -h 127.0.0.1 --password=password --port=2345 //OK
mysql -u root mydb -h 0.0.0.0 --password=password --port=2345 //OK
mysql -u root mydb -h localhost --password=password --port=2345 //KO <-
错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
我使用以下docker文件创建映像。
DockerFile:
FROM mysql:8.0
COPY *.sql /docker-entrypoint-initdb.d/
docker-compose.yaml:
version: '3.7'
services:
ls:
image: ***/db-container:v6 # <-my image
container_name: db-container
restart: always
environment:
MYSQL_DATABASE: 'mydb'
MYSQL_USER: 'user'
MYSQL_PASSWORD: 'password'
MYSQL_ROOT_PASSWORD: 'password'
ports:
# <Port exposed> : < MySQL Port running inside container>
- '2345:3306'
expose:
# Opens port 3306 on the container
- '3306'
volumes:
- db-container:/var/lib/mysql
volumes:
db-container:
在容器内部查询:
mysql> SELECT host, user FROM mysql.user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | root |
| % | user |
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+------------------+
mysql> SELECT * FROM performance_schema.host_cache;
Empty set (0.02 sec)
答案 0 :(得分:2)
“ localhost”表示使用套接字。但是VPS可能仅允许TCP / IP连接,而不允许“套接字”。
答案 1 :(得分:2)
我猜在本地计算机上,您未使用docker。但是,在vps上,您是。
在本地,mysql本身已安装在OS上,因此,它已在/var/run/mysqld/mysqld.sock中公开了其套接字文件。但是,在VPS上,套接字位于docker内部。
这里的亮点是localhost
和127.0.0.1
在参考mysql方面的区别。在基于unix的系统(包括mac)上,localhost
通过套接字连接,而127.0.0.1
通过TCP / IP连接。
尝试在docker-compose volume部分下添加以下内容。看看是否行得通。
volumes:
- /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysqld.sock
答案 2 :(得分:1)
拒绝连接有很多不同的根本原因。
由于可以在容器内执行查询,所以最好的做法是检查performance_schema.host_cache
表:
SELECT * FROM performance_schema.host_cache;
应该更准确地指出问题所在。
文档: https://dev.mysql.com/doc/mysql-perfschema-excerpt/8.0/en/host-cache-table.html