Laravel Docker - SQLSTATE [HY000] [2002] php_network_getaddresses:getaddrinfo 失败:名称或服务未知
Posted
技术标签:
【中文标题】Laravel Docker - SQLSTATE [HY000] [2002] php_network_getaddresses:getaddrinfo 失败:名称或服务未知【英文标题】:Laravel Docker - SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known 【发布时间】:2020-03-28 00:25:42 【问题描述】:在我的容器中运行 php artisan migrate 我不断收到此错误
In Connector.php line 67:
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
In Connector.php line 67:
PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known
这是我的 .ENV 文件
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:etukbJpSLgbRsdf5uOEGtLT5Qw+XB6y06Q38HPr
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://127.0.0.1:8000/
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=project
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
我尝试将 DB_HOST 更改为 mysql,但结果仍然相同,并将其更改为 mariadb
这是我的 docker-compose 文件
version: '3'
services:
# The Application
app:
build:
context: ./
dockerfile: app.dockerfile
working_dir: /var/www
volumes:
- ../.:/var/www
- ./custom.ini:/usr/local/etc/php/conf.d/custom.ini
environment:
- "DB_PORT=3306"
- "DB_HOST=database"
# The Web Server
web:
build:
context: ./
dockerfile: web.dockerfile
working_dir: /var/www
volumes:
- ../.:/var/www
- ./vhost.conf:/etc/nginx/conf.d/default.conf
ports:
- 8082:80
# The Database
database:
image: mysql:5.7
volumes:
- dbdata:/var/lib/mysql
environment:
MYSQL_USER: $DB_USERNAME
MYSQL_DATABASE: $DB_DATABASE
MYSQL_ROOT_PASSWORD: $DB_PASSWORD
ports:
- "33061:3306"
volumes:
dbdata:
我在网上搜索了解决方案,但没有一个有帮助。有人对我为什么不断收到该错误有任何建议吗?
【问题讨论】:
使用独立容器时为什么要写DB_HOST=localhost
?
【参考方案1】:
您应该将 container_name 添加到您的数据库服务中
database:
image: mysql:5.7
container_name: database
并在您的 .env MYSQL_HOST 中将该名称引用为:
MYSQL_CONNECTION=mysql
MYSQL_HOST=database
MYSQL_PORT=3306
而不是使用本地主机
您还应该使用网络连接数据库服务和应用程序
在 docker-compose 的末尾添加一个网络块
networks:
app-network:
driver: bridge
并将此块添加到数据库服务和应用服务的末尾
demo_db:
.
.
.
networks:
- app-network
app:
.
.
.
networks:
- app-network
这里是一个简单的 laravel 应用程序的工作演示
https://bitbucket.org/RamiAmro/hello-laravel-docker/
【讨论】:
除了 Compose 提供的default:
之外,您既不需要 container_name:
也不需要其他网络来进行容器间通信。在原始问题的 docker-compose.yml
文件中,database
应该可以用作 DNS 名称而无需任何修改。
正确,如果没有指定网络,它们都在默认网络上
完美。谢谢@rami 为我工作【参考方案2】:
如果您作为外部 docker 容器连接到 mysql,请确保您实施了此解决方案 https://***.com/a/38089080/1770571
【讨论】:
【参考方案3】:我遇到了同样的问题。在我的情况下,我发现在 Sailing 日志中可以看到恢复 InnoDB 数据库存在问题
!!小心(这将删除整个数据库)!!
因为这是我的开发环境,我尝试删除现有卷
./vendor/bin/sail down -v
然后再次启动一个新容器
./vendor/bin/sail up
【讨论】:
【参考方案4】:现在有 Laravel Sail 可供任何仍然感兴趣的人使用。
https://laravel.com/docs/8.x/sail
Laravel Sail 是一个用于交互的轻量级命令行界面 使用 Laravel 的默认 Docker 开发环境。 Sail 提供了一个 使用 PHP 构建 Laravel 应用程序的绝佳起点, MySQL 和 Redis,无需具备 Docker 经验。
【讨论】:
以上是关于Laravel Docker - SQLSTATE [HY000] [2002] php_network_getaddresses:getaddrinfo 失败:名称或服务未知的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Docker - SQLSTATE [HY000] [2002] php_network_getaddresses:getaddrinfo 失败:名称或服务未知
我无法在我的 docker compose 中进行 mysql php artisan 迁移。错误 SQLSTATE[HY000] [2002]
SQLSTATE[HY000] [1049] 未知数据库 'laravel'
SQLSTATE [23502]:非空违规:7 错误 - laravel
Laravel:SQLSTATE [28000] [1045] 用户 'homestead'@'localhost' 的访问被拒绝