簡體   English   中英

在 Docker 中安裝 MySQL 失敗並顯示錯誤消息“無法通過套接字連接到本地 MySQL 服務器”

[英]Installing MySQL in Docker fails with error message "Can't connect to local MySQL server through socket"

我正在嘗試在 docker 容器中安裝 mysql,嘗試了來自 github 的各種圖像,似乎它們都成功安裝了 mysql,但是當我嘗試運行 mysql 時出現錯誤:

錯誤 2002 (HY000):無法通過套接字“/var/run/mysqld/mysqld.sock”連接到本地 MySQL 服務器

系統規格:

  • Ubuntu 12,04 在 AWS 上
  • 碼頭工人 0.10.0

到目前為止我嘗試過的軟件包:

請記住,您需要連接到正在運行的 docker 容器。 所以你可能想使用 tcp 而不是 unix socket。 檢查docker ps命令的輸出並查找正在運行的 mysql 容器。 如果你找到了,那么使用像這樣的 mysql 命令: mysql -h 127.0.0.1 -P <mysql_port> (你會在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 where "tutum/mysql"是在docker images找到的圖像名稱。

我遇到了同樣的問題,事實上,我只是在安裝后忘記運行該服務..

啟動mysql服務器:

/etc/init.d/mysql start

不知道如何實現這一點,但是,我可以通過鍵入來訪問 MYSQL

$ mysql -u 根 -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...........

就我而言,我嘗試像這樣連接到 DB(在 docker 中):

mysql -ppass -u root

但得到與 OP 相同的錯誤。

指定主機和端口有助於:

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

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

您只需打開 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

如果你的主機上沒有安裝 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 db 服務,則可以使用: docker-compose exec database mysql -u root -p

查看database.yml文件中的內容。 如果你已經有你的普通 Rails 應用程序並且簡單地用 Docker 包裝它,你應該改變(在database.yml ):

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

host: db 

其中db是來自docker-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/

在提出這個問題幾個月后,我提升了我的 Docker 技能。 我應該改用 Docker 容器名稱。

使用 dokerized-nginx 作為橋來暴露容器的 ip+port。

在 WEB 配置中,我現在使用mysql://USERNAME:PASSWORD@docker_container_name/DB_NAME通過mysql://USERNAME:PASSWORD@docker_container_name/DB_NAME訪問 Mysql 套接字(也適用於 docker-compose,使用 compose-name 而不是容器一)

我今天遇到了同樣的問題,請嘗試使用此命令運行您的容器。

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

主機指定為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

對我來說,這只是重新啟動 docker 守護進程的問題。

假設您正在使用docker-compose.yml -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:

注意mysql_db_containerports定義

    ports:
      - 3307:3306

<= 表示可以通過本地主機工作站的 3307 端口和 docker net 中的 3306 端口訪問 mysql

運行以下命令以查看您的容器名稱:

$ 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>

從 Web 容器連接

引用 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 (您可以在運行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> 

我的問題是我試圖從一個似乎與我安裝的 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: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

(有時我會收到另一個錯誤:“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

要從您的機器連接到 mysql,請使用 127.0.0.1

要從另一個容器內部連接到 mysql-container,您需要找出內部 ip。

docker inspect mysqlcontainername | grep Gatewaw

使用 ip 地址 '127.0.0.1' 代替主機名 'localhost'

基本上,拉取MySQL后需要一些時間才能啟動。 確保在幾分鍾(可能 2-3 分鍾)后嘗試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM