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

问题描述 投票:26回答:9

我正在尝试在docker容器中安装mysql,尝试从github的各种图像,似乎他们都设法成功安装mysql但是当我尝试运行mysql时它给出了一个错误:

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

系统规格:

  • Ubuntu 12,04在AWS上
  • Docker 0.10.0

我到目前为止尝试的包:

mysql docker
9个回答
51
投票

请记住,您需要连接到正在运行的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中找到的图像名称。


15
投票

我遇到了同样的问题,事实上,我安装后忘了运行服务。

启动mysql服务器:

/etc/init.d/mysql start

12
投票

不知道我是如何实现这一点的,但是,我已经能够通过输入来达到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...........

4
投票

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

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

此外,如果您正在使用Docker Compose,并且您已声明了名为database的mysql数据库服务,则可以使用: docker-compose exec database mysql -u root -p


3
投票

我可能会迟到一点回答,现在世界可能已经知道了。

所有你必须打开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


2
投票

看看你的database.yml文件中有什么。如果您已经拥有普通的Rails应用程序并且只是使用Docker将其包装起来,那么您应该更改(在database.yml内部):

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

host: db 

其中dbdocker-compose.yml的db-service名称。这是我的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

您在控制台(在app文件夹中)以docker-compose up启动应用程序。然后等待1分钟(让你的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/


2
投票

在这个问题之后几个月,我已经掌握了我的Docker技能。我应该使用Docker容器名称。

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

在WEB配置中,我现在使用mysql://USERNAME:PASSWORD@docker_container_name/DB_NAME通过docker访问Mysql socket(也可以使用docker-compose,使用compose-name而不是容器1)


1
投票

我今天遇到了同样的问题,尝试用这个命令运行你的容器。

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.