docker-compose中的“无法连接到本地MySQL服务器”

我有MySQL的Laravel应用程序,我试图在Docker中使用docker-compose来运行它。 但是,当试图连接数据库的应用程序,它会抛出:

Connector.php中的PDOException第55行:SQLSTATE [HY000] [2002]无法通过套接字'/var/run/mysqld/mysqld.sock'连接到本地MySQL服务器(2)

我的docker-compose.yml:

load_balancer: image: tutum/haproxy links: - web ports: - "80:80" cache: image: redis db: image: mysql environment: MYSQL_ROOT_PASSWORD: Q1w2e3r4t5 MYSQL_DATABASE: regappbase web: image: andrewmclagan/nginx-hhvm links: - db - cache volumes: - ./:/var/www environment: - APP_ENV=local - DB_DATABASE=regappbase - DB_PASSWORD=Q1w2e3r4t5 - VIRTUAL_HOST=laravel.local 

我的.env:

 APP_ENV=production APP_DEBUG=true APP_KEY=SomeRandomString APP_URL=http://laravel.local DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=regappbase DB_USERNAME=root DB_PASSWORD=Q1w2e3r4t5 CACHE_DRIVER=file SESSION_DRIVER=file QUEUE_DRIVER=sync REDIS_HOST=laravel.local REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp MAIL_HOST=mailtrap.io MAIL_PORT=2525 

默认情况下,Mysql与“localhost”的连接尝试通过本地机器上的套接字进行连接。 您的DB_HOST应该是链接的容器名称“db”。

从MYSQL文档 :

在Unix上,MySQL程序专门处理主机名localhost,与其他基于networking的程序相比,这种方式可能与您期望的不同。 对于连接到本地主机,MySQL程序试图通过使用Unix套接字文件连接到本地服务器。 即使给出了–port或-P选项来指定端口号,也会发生这种情况。 要确保客户端与本地服务器build立TCP / IP连接,请使用–host或-h指定主机名值127.0.0.1,或者本地服务器的IP地址或名称。 您也可以通过使用–protocol = TCP选项来显式指定连接协议,即使对于本地主机也是如此。 例如:

您可以在.env中将DB_HOST localhost更改为ip 。 接收ip mysql的docker容器需要写命令:

 docker exec -it <CONTAINER_ID> ip add show eth0