Laradock 是基於 Docker 提供的完整 PHP 本地開發環境
在框架中連接 MySQL 時 報錯
SQLSTATE[HY000] [2002] Connection refused
主要還是是對 Docker 容器的隔離機制理解不夠,每個容器之間都是隔離的,如果有相互依賴的服務,則需要進行顯示的關聯,比如使用選項
--link
。
同理,使用docker-compose
時候,容器之間進行關聯是采用類似如下的方式:
# docker-compose.xml 縮減版
version: '2'
services:
...
php:
build: ./php
...
links:
- "mysql"
mysql:
build: ./mysql
ports:
- "3306:3306"
environment:
MYSQL_PASSWORD: root
注意,關鍵地方來了:測試連接 MySQL 的代碼其實是運行在 PHP 對應的容器里,而 MySQL 服務是在它自己對應的容器里,當我們的 host 填寫 127.0.0.1 時候,其實對應的是 PHP 容器里面,所以不可能找到對應的服務,從而引起上面拒絕連接的錯誤。
那么,怎么進行連接呢?
其實容器之間關聯之后,可以通過容器名進行連接。
在上面的 docker-compose.xml
文件中,MySQL 服務對應的容器名是 mysql
,PHP 容器與它關聯的名字也是 mysql
,所以把 127.0.0.1
改成 mysql
再進行連接即可。
# thinkphp項目 修改database.php文件
'hostname' => 'mysql',
# Laravel 項目修改 .env 文件
DB_HOST=mysql