【问题标题】:Docker + Laravel issue [SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution]Docker + Laravel 问题 [SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution]
【发布时间】:2020-05-08 18:54:56
【问题描述】:

我在 ubuntu 机器上安装了 docker,我正在尝试运行一个 laravel 应用程序。

MySQL 服务在 docker-compose.yml 文件中有 service_name: mysql,而 .env 文件中有 DB_HOST=mysql

我记得 .env 文件应该指出 DB_HOST=mysql 指向 mysql docker 服务 IP。然而这并没有发生,在运行迁移后我得到:

Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution (SQL: SHOW FULL TABLES WHERE table_type = 'BASE TABLE')

首先我运行docker-compose build,然后我运行docker-compose up -d,我的所有 3 个服务都已启动并运行。

如果我提取 MySQL 服务的 IP 并在 .env 文件中使用它,如下所示:

DB_HOST=172.18.0.2

然后我可以成功运行迁移,在这种情况下一切正常。

但是,我认为这是不好的做法,因为如果重新启动 MySQL 服务,IP 地址可能会更改。我在这里遗漏了什么,为什么在我的.env 文件中为DB_HOST 使用service_name 无法解析数据库主机名?

docker-compose.yml:

version: '3'

networks:
  laravel:

services:
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
      - mysql
    networks:
      - laravel
  mysql:
    image: mysql:5.7.22
    container_name: mysql
    restart: unless-stopped
    tty: true
    ports: 
      - "3306:3306"
    volumes: 
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: laraone
      MYSQL_USER: laraone_user
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - laravel
  php:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: php
    volumes: 
      - ./src:/var/www/html
    depends_on:
      - mysql
    ports:
      - "9000:9000"
    networks:
      - laravel

.env:

APP_NAME=Laraone
APP_ENV="local"
APP_KEY=base64:PMwGrcSu2ioPEj75dv5gcdWAogESOtt8UCr/gs0nOtw=
APP_DEBUG=true
APP_URL=http://localhost:8080

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laraone
DB_USERNAME=laraone_user
DB_PASSWORD=secret

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=

MAIL_FROM_ADDRESS=noreply@example.com
MAIL_FROM_NAME="${APP_NAME}"

MAIL_SENDMAIL="/usr/sbin/sendmail -bs"

【问题讨论】:

  • DB_HOST=mysql 这应该是localhost127.0.0.1。它需要主机名或 IP 才能找到服务器。
  • @aynber 在 Docker 上下文中这是错误的:localhost 几乎总是“这个容器”。 (但如果问题是关于尝试从主机运行迁移,而堆栈则在 Docker 中运行,localhost 将是正确的。)
  • @aynber 我不同意这一点。 DB_HOST 应设置为 mysql,因为这是 docker-compose.yml 文件中容器的服务名称。我运行一个 laravel 应用程序,这正是它的配置方式。我觉得网络有问题,但不明白为什么。我要做的是docker-compose exec php bashping mysqltelnet mysql 3306。您可能需要在容器中下载并安装其中任何一个包。
  • 感谢@leeman24 的解释。我使用宅基地,而不是 Docker,所以 HOST 对我来说是 localhost 或 IP。我没有意识到 Docker 设置了一个 mysql 主机名。
  • @themystery,同意这是奇怪的行为。这可能无济于事,只能执行 php 并运行echo $DB_HOST。也许你的 .env 文件没有被正确应用,尽管当你说你改变了它给出不同行为的值时。

标签: php mysql laravel docker docker-compose


【解决方案1】:

我认为您尝试在 php docker 容器外运行“php artisan migrate”命令。

你应该在 php 容器中运行 php artisan migrate 命令。

尝试关注;

docker ps --> list running containers

docker exec -it <your_container_id> bash

现在你可以运行了;

php artisan migrate

编辑: 您也可以在不输入容器 bash 的情况下编写 artisan 命令,如下所示;

docker exec -i <your_container_id> php artisan migrate

【讨论】:

  • 是的。这对我有帮助,我花了一整天的时间来修复它。
【解决方案2】:

对于任何仍然想要 dockerized Laravel 环境的人,请查看 Laravel Sail。它允许您使用别名 sail 轻松地将命令路由到 docker 实例。喜欢sail artisan migrate

https://laravel.com/docs/8.x/sail

Laravel Sail 是一个用于交互的轻量级命令行界面 使用 Laravel 的默认 Docker 开发环境。 Sail 提供了一个 使用 PHP 构建 Laravel 应用程序的绝佳起点, MySQL 和 Redis,无需具备 Docker 经验。

【讨论】:

    【解决方案3】:

    我通过在 php 容器中安装 laravel 应用程序解决了这个问题。帮助我解决此问题的简单 1 行命令:docker exec -it php php artisan app:install

    【讨论】:

      猜你喜欢
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 2016-01-20
      • 2019-04-13
      • 2018-07-12
      • 1970-01-01
      相关资源
      最近更新 更多