“Can't connect to local MySQL server” in docker-compose

匿名 (未验证) 提交于 2019-12-03 02:33:02

问题:

I have Laravel application with MySQL and I'm trying to run it in Docker using docker-compose. But when app trying to connect DB, it throws:

PDOException in Connector.php line 55: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

My 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 

My .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 

回答1:

Mysql connections to "localhost" by default attempt to connect over a socket present on the local machine. Your DB_HOST should be the linked container name, "db".

From the MYSQL docs:

On Unix, MySQL programs treat the host name localhost specially, in a way that is likely different from what you expect compared to other network-based programs. For connections to localhost, MySQL programs attempt to connect to the local server by using a Unix socket file. This occurs even if a --port or -P option is given to specify a port number. To ensure that the client makes a TCP/IP connection to the local server, use --host or -h to specify a host name value of 127.0.0.1, or the IP address or name of the local server. You can also specify the connection protocol explicitly, even for localhost, by using the --protocol=TCP option. For example:



回答2:

You can change DB_HOST localhost to ip in .env. To receive ip mysql docker container need write command:

docker exec -it <CONTAINER_ID> ip add show eth0 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!