![](/img/trans.png)
[英]Docker MySQL mysqli::real_connect():(HY000/2002): Connection refused
[英]Docker MYSQL '[2002] Connection refused'
我是第一次嘗試 Docker。 啟動並運行了 LEMP 堆棧,但我無法連接到 MYSQL 數據庫。 不在我的 Symfony 應用程序上,不在 PHPMyAdmin 上。 應用程序返回以下錯誤代碼:
驅動程序中發生異常:SQLSTATE[HY000] [2002] 連接被拒絕
這是我的 docker-compose.yml:
nginx:
image: tutum/nginx
ports:
- "80:80"
links:
- phpfpm
volumes:
- ./nginx/default:/etc/nginx/sites-available/default
- ./nginx/default:/etc/nginx/sites-enabled/default
- ./logs/nginx-error.log:/var/log/nginx/error.log
- ./logs/nginx-access.log:/var/log/nginx/access.log
phpfpm:
build: phpfpm/
ports:
- "9000:9000"
volumes:
- ./public:/usr/share/nginx/html
mysql:
image: mariadb
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: admin
phpmyadmin:
image: phpmyadmin/phpmyadmin
restart: always
links:
- mysql
ports:
- 8183:80
environment:
MYSQL_USERNAME: admin
MYSQL_ROOT_PASSWORD: admin
PMA_ARBITRARY: 1
Dockerfile PHPFPM:
FROM php:fpm
RUN docker-php-ext-enable opcache
RUN apt-get update \
&& apt-get install -y --no-install-recommends libpq-dev \
&& docker-php-ext-install mysqli pdo_pgsql pdo_mysql
GitHub 網址: https : //github.com/MolengraafFrank/DockerSymfony
有人可以幫我嗎? 感謝您的時間。
“[2002] 連接被拒絕”意味着您可以訪問數據庫服務器,但您沒有用戶的正確訪問權限(在您的情況下為管理員)。 默認情況下,mariadb 有一個 root 用戶,其密碼由 MYSQL_ROOT_PASSWORD 給出,該用戶可以從任何服務器 (%) 進行連接。
如果您想對您的數據庫使用過度登錄,您必須在數據庫服務器中創建它,並從所選位置對數據庫進行正確授權。
這里的問題是您將數據庫服務器命名為“mysql”(docker-compose 文件中的服務名稱)。 但默認情況下,phpmyadmin 會嘗試連接到名為“db”的數據庫服務器。 在phpmyadmin服務的環境部分下添加PMA_HOST: mysql
就可以解決這個問題。
我遇到了這個挑戰,因為我正在運行 3 個具有不同 IP 地址的不同容器
db - 172.18.0.3 - container for MYSQL
app - 172.18.0.2 - container for Laravel app
所以我通過編輯我的 Laravel .env 文件來修復它
DB_CONNECTION=mysql
DB_HOST=172.18.0.3
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=username
...
獲取你的容器IP地址。 從您的 docker 主機
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
更新:對於最新的 docker 版本並基於您的 docker-compose.yml 中的服務名稱“mysql”
mysql:
image: mariadb
ports:
- 3306:3306
你可以試試這個:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=username
DB_HOST 是 docker-compose.yml 中定義的 MySQL 服務名稱
我已經設法使用 mysql 命令行工具連接到 mysql 實例,這是我使用的命令 - mysql -u root -p -h 127.0.0.1
,並輸入管理員密碼。 這對你來說是一個足夠的解決方案嗎?
就我而言,我在端口映射到主機 mac ( 3306:3306
) 的 docker 容器中運行mysql
。 我嘗試使用 127.0.0.1 從phpmyadmin
docker 容器連接到這個數據庫。 但它不起作用,因為phpmyadmin
docker 容器上的localhost
沒有運行所需的mysql
。
從 docker 網絡連接到主機
docker.for.mac.host.internal
就我而言,問題出在端口映射上。
就我而言,它是3307:3306
,只要我在右側將其更改為3307
,就可以連接到數據庫實例。
添加DB_READ_HOST=db
為我解決了這個問題
如果你想知道你的連接失敗的原因,你可以在你的終端中使用 php artisan tinker
然后像
DB::connection()->getPdo();
不幸的是,這只會給你一部分錯誤。 退出 tinker ,然后使用此命令php artisan db
將為您提供有關該問題的更多信息,例如數據庫類型、主機、端口、廣告用戶。
像這個
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1:3306' (61)
Symfony\Component\Process\Exception\ProcessFailedException
The command "'mysql' '--host=127.0.0.1' '--port=3306' '--user=root' '--default-character-set=utf8mb4' 'laravel'" failed.
Exit Code: 1(General error)
Working directory: /Users/Dev/Documents/www/laravel_docker/src/addressAPI
Output:
================
Error Output:
================
at vendor/symfony/process/Process.php:270
266▕ */
267▕ public function mustRun(callable $callback = null, array $env = []): self
268▕ {
269▕ if (0 !== $this->run($callback, $env)) {
➜ 270▕ throw new ProcessFailedException($this);
271▕ }
272▕
273▕ return $this;
274▕ }
+14 vendor frames
15 artisan:37
Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
這不會給你什么是錯誤的答案,但至少你可以理解為什么你的配置是錯誤的。
您需要將 phpfpm 容器鏈接到 mysql。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.