在 Docker 中安装 MySQL 失败并显示错误消息“无法通过套接字连接到本地 MySQL 服务器”

Posted

技术标签:

【中文标题】在 Docker 中安装 MySQL 失败并显示错误消息“无法通过套接字连接到本地 MySQL 服务器”【英文标题】:Installing MySQL in Docker fails with error message "Can't connect to local MySQL server through socket" 【发布时间】:2014-06-07 16:49:01 【问题描述】:

我正在尝试在 docker 容器中安装 mysql,尝试了来自 github 的各种图像,似乎它们都成功安装了 mysql,但是当我尝试运行 mysql 时出现错误:

ERROR 2002 (HY000): 无法通过套接字 '/var/run/mysqld/mysqld.sock' 连接到本地 MySQL 服务器

系统规格:

Ubuntu 12,04 在 AWS 上 Docker 0.10.0

到目前为止我尝试过的包:

https://github.com/eugeneware/docker-wordpress-nginx https://github.com/tutumcloud/tutum-docker-mysql

【问题讨论】:

mysql服务在运行吗?服务不会在容器中自动运行。它们必须明确启动 是的,我知道,但是如果您查看第一个链接,则有一个启动文件,一旦加载容器,它将在其中运行所有服务。 【参考方案1】:

基本上拉取MySQL后需要一些时间才能启动。确保您在几分钟后尝试(可能 2-3 分钟)。

【讨论】:

【参考方案2】:

使用 ip 地址 '127.0.0.1' 而不是主机名 'localhost'

【讨论】:

【参考方案3】:

要从您的机器连接到 mysql,请使用 127.0.0.1

要从另一个容器内连接到 mysql-container,您需要找出内部 ip。

docker inspect mysqlcontainername | grep Gatewaw

【讨论】:

【参考方案4】:

我的问题是我试图从一个似乎与我安装的 mysql 服务器不兼容的 mysql 客户端版本进行连接(mysql:latest 在撰写本文时安装了 8.0.22 版)。

我的mysql客户端版本:

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using  EditLine wrapper

我用来安装mysql的docker命令:latest:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=somerootpassword -e MYSQL_USER=someuser -e MYSQL_PASSWORD=someuserpassword -d -p 3306:3306 mysql:latest

从本地 mysql 客户端连接到 mysql 服务器时遇到的错误:

$ mysql -u someuser -p -h 127.0.0.1
ERROR 2026 (HY000): SSL connection error: unknown error number

(有时我会收到另一个错误:“ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 2”。但我认为当我尝试连接到服务器时会发生这种情况在我开始之后太早了)

我的解决方案是安装 mysql:5.7:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=somerootpassword -e MYSQL_USER=someuser -e MYSQL_PASSWORD=someuserpassword -d -p 3306:3306 mysql:5.7

然后我可以连接到服务器(大约等待 1 分钟,直到服务器准备好接受连接):

$ mysql -u someuser -p -h 127.0.0.1

【讨论】:

【参考方案5】:

假设您使用的是 docker-compose,您的 docker-compose.yml 文件如下所示:

version: '3.7'
services:
  mysql_db_container:
    image: mysql:latest
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
    ports:
      - 3307:3306
    volumes:
      - mysql_db_data_container:/var/lib/mysql


  web:
    image: $DOCKER_IMAGE_NAME-eis:latest
    build:
      context: .
    links:
      - mysql_db_container
    ports:
      - 4000:3000
    command: ["./scripts/wait-for-it.sh", "mysql_db_container:3306", "--", "./scripts/start_web_server.sh"]
    volumes:
      - .:/opt/eis:cached
    env_file:
      - .env

volumes:
  mysql_db_data_container:

注意portsmysql_db_container 的定义

    ports:
      - 3307:3306

运行以下命令查看您的容器名称:

$ dc config --services
mysql_db_container
web

在这种情况下,我们有两个容器。

错误

如果您从 localhost 工作站连接到 mysql_db_container 并尝试访问那里的 mysql 控制台,您将收到该错误:

docker-compose run mysql_db_container bash
root@8880ffe47962:/# mysql -u root -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
root@8880ffe47962:/# exit

此外,如果您尝试从本地工作站连接,您也会收到该错误:

$ mysql -u root -p -P 3307
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

解决方案

从本地工作站连接

只需添加--protocol=tcp 参数(否则mysql 假设您要通过mysql 套接字连接):

$ mysql --protocol=tcp -u root -p -P 3307
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

从网络容器连接

引用 docker 主机名 -h mysql_db_container。请注意,当您在 Docker 上下文中运行时,假定 TCP 协议。

$ dc run web bash
Starting eligibility-service_mysql_db_container_1_d625308b5a77 ... done
root@e7852ff02683:/opt/eis# mysql -h mysql_db_container -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> 

从 mysql 容器连接

假设您的 mysql 容器名称是 eis_mysql_db_container_1_d625308b5a77(您可以在运行 docker ps 时看到),以下应该可以工作:

$ docker exec -it eis_mysql_db_container_1_d625308b5a77 bash
root@3738cf6eb3e9:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

【讨论】:

【参考方案6】:

主机 指定为 0.0.0.0 确实对我有用。

我使用以下命令创建了 docker 容器

docker run --detach --name=mysql --env="MYSQL_ROOT_PASSWORD=root" --publish 3306:3306 mysql

然后安装mysql客户端

sudo apt-get install mysql-client

使用以下命令通过终端连接到 mysql

mysql --host 0.0.0.0 --port 3306 -proot -u root

【讨论】:

【参考方案7】:

就我而言,我尝试像这样连接到 DB(位于 docker 内部):

mysql -ppass -u root

但得到与 OP 相同的错误。

指定主机和端口有帮助:

mysql --host 0.0.0.0 --port 3306 -ppass -u root

【讨论】:

【参考方案8】:

我今天遇到了同样的问题, 尝试使用此命令运行您的容器。

docker run --name mariadbtest -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mypass -d mariadb/server:10.3

【讨论】:

【参考方案9】:

对我来说,这只是重新启动 docker 守护进程的问题..

【讨论】:

【参考方案10】:

问完这个问题几个月后,我提升了我的 Docker 技能。我应该改用 Docker 容器名称。

使用dokerized-nginx作为桥接器来暴露容器的ip+port。

在WEB配置中,我现在使用mysql://USERNAME:PASSWORD@docker_container_name/DB_NAME通过docker访问Mysql socket(也可以和docker-compose一起使用,使用compose-name代替容器一)

【讨论】:

【参考方案11】:

查看您的 database.yml 文件中的内容。如果您已经有了普通的 Rails 应用程序并简单地用 Docker 包装它,您应该更改(在 database.yml 内):

socket: /var/run/mysqld/mysqld.sock #just comment it out

host: db 

其中dbdocker-compose.yml 中我的数据库服务的名称。这是我的docker-compose.yml

version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    links:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root

您在控制台(在应用程序文件夹中)以docker-compose up 启动您的应用程序。然后WAIT 1 MINUTE(让你的mysql服务完全加载)直到控制台中不再出现一些新日志。通常最后一行应该是

db_1 | 2017-12-24T12:25:20.397174Z 0 [注] 列表结束 非本地分区表

然后(在新的终端窗口中)应用:

docker-compose run web rake db:create

然后

docker-compose run web rake db:migrate

完成工作后,使用

停止加载的图像
docker-compose stop

不要在此处使用docker-compose down,否则会删除数据库内容。

下次您想恢复工作时申请:

docker-compose start

其余的事情完全按照这里的解释:https://docs.docker.com/compose/rails/

【讨论】:

【参考方案12】:

我的回答可能有点晚了,现在可能全世界都知道了。

您只需打开 docker 容器的端口即可访问它。例如在运行容器时:

docker run --name mysql_container -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306mysql/mysql-server:5.7

这将允许从主机访问容器的 mysql。稍后您可以连接到它。

docker exec -it mysql_container mysql -u root -p

【讨论】:

【参考方案13】:

我也遇到了同样的问题,其实我只是安装后忘记运行服务了..

启动mysql服务器:

/etc/init.d/mysql start

【讨论】:

问题是关于连接到 docker 容器而不是在本地运行 mysql。 谢谢你,Mega!即使您没有回答 PRECISE QUESTION,您也解决了我的问题!【参考方案14】:

如果您的主机上没有安装 MySQL,则必须在 容器中执行它(https://docs.docker.com/engine/reference/commandline/exec/#/examples 解释了 docker run docker exec)。

考虑到您的容器正在运行,您可以使用 docker exec yourcontainername mysql -u root -p 访问客户端。

另外,如果您使用的是 Docker Compose,并且您已经声明了一个名为 database 的 mysql db 服务,您可以使用: docker-compose exec database mysql -u root -p

【讨论】:

【参考方案15】:

不知道如何实现,但是,我可以通过输入访问 MYSQL

$ mysql -u root -h

mywebsite:
  image: benftwc/pldev-webserver
  volumes:
    - ./mywebsite.fr/:/var/www/
  working_dir: /var/www/
  ports:
    - "8009:8009"
  command: php -S 0.0.0.0:8009
  links:
    - database
database:
  image: library/mysql
  environment:
    MYSQL_ROOT_PASSWORD: root
  ports:
    - "3310:3306

root@422f4d1f454a:/# mysql -u root -h 127.0.0.1 -p3310
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

root@422f4d1f454a:/# mysql -u root -h database -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g...........

【讨论】:

这看起来很新,我要试试。感谢您的回答。 我尝试了很多东西,无法解释它是如何工作的。我认为它基于“链接”参数创建了一个新主机 第一次尝试时无法连接,因为您必须使用 -p 而不是 -P 和 -h 127.0.0.1 而不是 -h 0.0.0.0。然后,在第二个命令中它起作用了,因为您没有放弃命令中的端口,然后默认为 3306。【参考方案16】:

请记住,您需要连接到正在运行的 docker 容器。所以你可能想使用 tcp 而不是 unix 套接字。检查docker ps 命令的输出并寻找正在运行的mysql 容器。如果你找到了,那么使用 mysql 命令如下:mysql -h 127.0.0.1 -P <mysql_port>(你会在docker ps 输出中找到端口)。 如果在 docker ps 输出中找不到任何正在运行的 mysql 容器,请尝试 docker images 查找 mysql 映像名称并尝试使用以下方式运行它: docker run -d -p 3306:3306 tutum/mysql 其中“tutum/mysql”是在docker images 中找到的图像名称。

【讨论】:

使用 --protocol=tcp 运行 mysql 命令将使客户端通过“tcp”连接。完整命令如下所示:mysql -h localhost -P 3306 --protocol=tcp 在基于 Unix 的系统中,如果您连接到主机“localhost”,MySQL 将假定您要使用套接字。在这里你有一个完整的答案如何解决这个问题:serverfault.com/a/337928/467190 是的!将localhost 更改为127.0.0.1 解决了这个问题。谢谢! 对我有用的-h ip 是ifconfig docker0 中的IP

以上是关于在 Docker 中安装 MySQL 失败并显示错误消息“无法通过套接字连接到本地 MySQL 服务器”的主要内容,如果未能解决你的问题,请参考以下文章

连接docker里面的mysql失败解决

在 Docker 的 CentOS7 镜像 中安装 mysql

在 Docker 的 CentOS7 镜像 中安装 mysql

在Docker中安装并修改MySQL中的 my.cnf 配置文件

在Docker中安装并修改MySQL中的 my.cnf 配置文件

在Windows Docker中安装MySQL