【问题标题】:Laravel with docker database error: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolveLaravel 与 docker 数据库错误:SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve
【发布时间】:2020-11-19 02:44:43
【问题描述】:

我知道有类似的问题,但答案无济于事。

我有这台服务器,我之前在其中安装了以下两个存储库:

现在我添加了一个 Laravel 应用程序。 Laravel 应用程序现在正在运行,域已由 Nginx 代理正确解析,并且 Letsencrypt 正在正常运行。

但是,现在问题出在数据库连接上。当我运行php artisan migrate --seed 时出现以下错误:

在 Connection.php 第 671 行:

SQLSTATE[HY000] [2002] php_network_getaddresses:getaddrinfo 失败: 名称无法解析(SQL:从 information_schema.tables 中选择 * 其中 table_schema = mydb 和 table_name = 迁移和 table_type = '基表')

在 Connector.php 第 70 行: SQLSTATE[HY000] [2002] php_network_getaddresses:getaddrinfo 失败: 名称无法解析

在 Connector.php 第 70 行: PDO::__construct(): php_network_getaddresses: getaddrinfo 失败:名称 没有解决

这是我的docker-compose.yml 文件:

version: '3'

networks:
    default:
       external:
         name: ${NETWORK}

services:
  nginx:
    image: nginx:stable-alpine
    container_name: app-webserver
    expose:
      - "80"
      - "443"
    volumes:
      - ./src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    environment:
      - VIRTUAL_HOST=${VIRTUAL_HOST}
      - LETSENCRYPT_HOST=${LETSENCRYPT_HOST}
      - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}
    depends_on:
      - php
      - mysql

  mysql:
    image: mysql:5.7.29
    container_name: app-mysql
    restart: unless-stopped
    tty: true
    expose:
      - "3306"
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql

  php:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: app-php
    volumes:
      - ./src:/var/www/html
    environment:
      - VIRTUAL_HOST=${VIRTUAL_HOST}
      - LETSENCRYPT_HOST=${LETSENCRYPT_HOST}
      - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}
    expose:
      - "9000"

  composer:
    image: composer:latest
    container_name: composer
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    depends_on:
      - php

  npm:
    image: node:13.7
    container_name: npm
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    entrypoint: ['npm']

  artisan:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: artisan
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql
    working_dir: /var/www/html
    entrypoint: ['php', '/var/www/html/artisan']

在 Laravel .env 文件中,我尝试了 DB_HOST 的所有可能值:

DB_HOST=localhost
DB_HOST=127.0.0.1
DB_HOST=mysql
DB_HOST=app-mysql

目前,我已经为 MySQL 容器名称设置了它:

DB_HOST=app-mysql

其他值是:

DB_CONNECTION=mysql
DB_PORT=3306

我仍然得到那个错误。

我试过从app-php容器到app-mysql容器的ping命令如下:

$ docker exec -ti app-php ping app-mysql

我确实得到了回应:

64 bytes from 172.18.x.x: seq=0 ttl=64 time=0.132 ms
64 bytes from 172.18.x.x: seq=1 ttl=64 time=0.240 ms
64 bytes from 172.18.x.x: seq=2 ttl=64 time=0.207 ms
64 bytes from 172.18.x.x: seq=3 ttl=64 time=0.208 ms

但是,如果我运行:

$ docker-compose run --rm artisan ping app-mysql

我收到以下错误:

命令“ping”未定义。

现在,如果我运行 docker-compose up 以查看发生了什么(没有 -d),我会看到以下内容,对于 MySQL:

app-mysql | 2020-07-29T15:43:24.159355Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
app-mysql | 2020-07-29T15:43:24.159523Z 0 [Note] IPv6 is available.
app-mysql | 2020-07-29T15:43:24.159582Z 0 [Note]   - '::' resolves to '::';
app-mysql | 2020-07-29T15:43:24.159688Z 0 [Note] Server socket created on IP: '::'.

有没有人知道如何解决这个问题?为什么 Artisan 或 PHP 容器无法连接到数据库容器?

解决方法

我使用 Laradock 解决了这个问题

【问题讨论】:

  • 你尝试过什么调试问题?
  • @NicoHaase 我刚刚在最后添加了一些调试结果。需要强调的一件事是[Note] Server hostname (bind-address): '*'; port: 3306,但那是什么意思呢?

标签: mysql laravel docker


【解决方案1】:

既然你在做container_name: app-mysql 在 docker compose 网络中,您应该使用主机名 app-mysql

简单的检查方法是连接到 php 容器并尝试 ping app-mysql 然后使用 mysql 控制台测试连接。这样你至少可以找到问题所在。

顺便说一句,因为它是 docker compose - 每次在 docker-compose.yml 中进行更改时,您都必须执行 docker compose downdocker compose up -d

【讨论】:

  • 我用 ping 测试过。 PHP 容器确实得到了 Mysql 的回复。但是,如果我从 Artisan 容器 ping,它会显示 ping command not found。我已将 Laravel 的 .env 文件的 DB_HOST 设置为 DB_HOST=app-mysql。但是,我得到同样的错误。我只跑了docker-compose up,没有-d,在Mysql部分我看到了这个:[Note] Server hostname (bind-address): '*'; port: 3306。会不会是这个问题?
  • ping command not found - 没问题,只是没有安装。 [Note] Server hostname (bind-address): '*'; port: 3306 这是正确的行为。它说它将使用此容器的任何 ip。您也可以尝试对所有内容使用静态 IP,例如:networks:`default:``ipv4_address:10.5.0.6`
  • 由于某种原因,在您的情况下,docker compose 无法将名称解析为 IP,尽管它是 docker compose 职责。所以所有东西的静态 IP 可能是您开发环境的解决方案。
【解决方案2】:

当你提示一个命令时,你使用本地的 php 库。这就是为什么你得到一个错误,因为你的本地 php 正在寻址到 docker-mysql 连接,在本地机器上你没有这样的连接。当你使用 Laravel Sail 时,你应该提示命令

sail php artisan migrate

也就是说,你是从 docker 的 php 库中提示的

附:提前为我典型的糟糕英语道歉?

【讨论】:

    猜你喜欢
    • 2022-12-24
    • 2020-05-08
    • 1970-01-01
    • 2016-03-20
    • 2016-01-20
    • 1970-01-01
    • 2019-04-13
    • 2021-08-07
    相关资源
    最近更新 更多