![](/img/trans.png)
[英]Mysql with docker: Can't connect to local MySQL server through socket
[英]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 服務器
系統規格:
到目前為止我嘗試過的軟件包:
請記住,您需要連接到正在運行的 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_container
的ports
定義
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>
引用 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 容器名稱是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.