在Docker中安装MySQL失败,出现错误消息"无法通过socket"连接到本地MySQL服务器。

时间:2014-04-23 03:47:28

标签: mysql docker

我试图在docker容器中安装mysql,尝试从github中获取各种图像,看起来他们都设法成功安装了mysql但是当我尝试运行mysql时会出错:

  

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

系统规格:

  • Ubuntu 12,04在AWS上
  • Docker 0.10.0

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

14 个答案:

答案 0 :(得分:45)

请记住,您需要连接到正在运行的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其中&#34; tutum / mysql&#34;是在docker images中找到的图像名称。

答案 1 :(得分:14)

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

启动mysql服务器:

/etc/init.d/mysql start

答案 2 :(得分: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...........

答案 3 :(得分:4)

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

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

此外,如果您使用的是Docker Compose,并且您已经声明了名为database的mysql数据库服务,则可以使用: {{1}}

答案 4 :(得分:2)

查看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

您可以在控制台(在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/

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:1)

我的回答可能有点迟,现在世界可能已经知道了。

您必须打开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

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

主机指定为 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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

对于我来说,我试图像这样连接到数据库(位于docker内部):

mysql -ppass -u root

但出现与OP相同的错误。

指定主机和端口有帮助:

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

答案 11 :(得分:0)

假设您使用的是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的{​​{1}}定义

mysql_db_container

<=这表示mysql将通过端口3307到localhost工作站以及通过docker net中的端口3306进行访问

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

    ports:
      - 3307:3306

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

错误

如果您从本地主机工作站连接到$ dc config --services mysql_db_container web 并尝试访问那里的mysql控制台,则会收到该错误:

mysql_db_container

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

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) 参数(否则mysql假定您要通过mysql套接字进行连接):

--protocol=tcp

从Web容器连接

参考docker主机名$ 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上下文中运行时,将假定使用TCP协议。

-h mysql_db_container

从mysql容器连接

假设您的mysql容器名称为$ 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)]> (运行eis_mysql_db_container_1_d625308b5a77时可以看到),则应该可以进行以下操作:

docker ps

答案 12 :(得分:0)

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

我的mysql客户端版本:

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

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

$ 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

(有时我会得到另一个错误:“错误2013(HY000):在'读取初始通信数据包'时,与MySQL服务器的连接丢失,系统错误: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 :(得分:0)

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

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

docker inspect mysqlcontainername | grep Gatewaw