在 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】:请记住,您需要连接到正在运行的 docker 容器。所以你可能想使用 tcp 而不是 unix socket。检查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【参考方案2】:
我也遇到了同样的问题,其实我只是安装后忘记运行服务了..
启动mysql服务器:
/etc/init.d/mysql start
【讨论】:
问题是关于连接到 docker 容器而不是在本地运行 mysql。 谢谢你,兆!即使您没有回答 PRECISE QUESTION,您也解决了我的问题!【参考方案3】:不知道如何实现,但是,我可以通过输入访问 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。【参考方案4】:就我而言,我尝试像这样连接到 DB(位于 docker 内部):
mysql -ppass -u root
但得到与 OP 相同的错误。
指定主机和端口有帮助:
mysql --host 0.0.0.0 --port 3306 -ppass -u root
【讨论】:
【参考方案5】:我的回答可能有点晚了,现在可能全世界都知道了。
您只需打开 docker 容器的端口即可访问它。例如在运行容器时:
docker run --name mysql_container -e MYSQL_ROOT_PASSWORD=root -d
-p 3306:3306
mysql/mysql-server:5.7
这将允许从主机访问容器的 mysql。稍后您可以连接到它。
docker exec -it mysql_container mysql -u root -p
【讨论】:
【参考方案6】:如果您的主机上没有安装 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
【讨论】:
【参考方案7】:查看您的 database.yml
文件中的内容。如果您已经有了普通的 Rails 应用程序并简单地用 Docker 包装它,您应该更改(在 database.yml
内):
socket: /var/run/mysqld/mysqld.sock #just comment it out
到
host: db
其中db
是docker-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/
【讨论】:
【参考方案8】:问完这个问题几个月后,我提升了我的 Docker 技能。我应该改用 Docker 容器名称。
使用dokerized-nginx作为桥梁暴露容器的ip+port。
在WEB配置中,我现在使用mysql://USERNAME:PASSWORD@docker_container_name/DB_NAME
通过docker访问Mysql socket(也可以和docker-compose一起使用,使用compose-name代替容器一)
【讨论】:
【参考方案9】:将 主机 指定为 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
【讨论】:
【参考方案10】:假设您使用的是 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:
注意ports
对mysql_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>
【讨论】:
【参考方案11】:我今天遇到了同样的问题, 尝试使用此命令运行您的容器。
docker run --name mariadbtest -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mypass -d mariadb/server:10.3
【讨论】:
【参考方案12】:我的问题是我试图从一个似乎与我安装的 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
【讨论】:
【参考方案13】:基本上拉取MySQL后需要一些时间才能启动。确保您在几分钟后尝试(可能 2-3 分钟)。
【讨论】:
【参考方案14】:对我来说,这只是重新启动 docker 守护进程的问题..
【讨论】:
【参考方案15】:使用 ip 地址 '127.0.0.1' 而不是主机名 'localhost'
【讨论】:
【参考方案16】:要从您的机器连接到 mysql,请使用 127.0.0.1
要从另一个容器内连接到 mysql-container,您需要找出内部 ip。
docker inspect mysqlcontainername | grep Gateway
【讨论】:
以上是关于在 Docker 中安装 MySQL 失败并显示错误消息“无法通过套接字连接到本地 MySQL 服务器”的主要内容,如果未能解决你的问题,请参考以下文章
在 Docker 的 CentOS7 镜像 中安装 mysql
在 Docker 的 CentOS7 镜像 中安装 mysql
在Docker中安装并修改MySQL中的 my.cnf 配置文件