【问题标题】:Laravel Docker - SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not knownLaravel Docker - SQLSTATE [HY000] [2002] php_network_getaddresses:getaddrinfo 失败:名称或服务未知
【发布时间】: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

标签: php laravel docker docker-compose


【解决方案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://stackoverflow.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 经验。

      【讨论】:

        猜你喜欢
        • 2015-07-22
        • 2017-06-26
        • 2017-08-13
        • 2019-01-14
        • 2021-03-22
        • 2023-04-02
        • 2017-02-21
        • 2013-12-02
        • 2016-02-07
        相关资源
        最近更新 更多