无法使用localhost

时间:2019-11-14 13:47:40

标签: mysql networking docker-compose localhost vps

我有两个环境:我的本地计算机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)

3 个答案:

答案 0 :(得分:2)

“ localhost”表示使用套接字。但是VPS可能仅允许TCP / IP连接,而不允许“套接字”。

答案 1 :(得分:2)

我猜在本地计算机上,您未使用docker。但是,在vps上,您是。

在本地,mysql本身已安装在OS上,因此,它已在/var/run/mysqld/mysqld.sock中公开了其套接字文件。但是,在VPS上,套接字位于docker内部。

这里的亮点是localhost127.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