Laravel与docker数据库错误:SQLSTATE [HY000] [2002] php_network_getaddresses:getaddrinfo失败:名称无法解析

时间:2020-07-29 13:32:31

标签: mysql laravel docker

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

我已经在此服务器上安装了以下两个存储库:

现在,我添加了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 = 'BASE TABLE')

在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

2 个答案:

答案 0 :(得分:0)

因为您在做container_name: app-mysql 在docker compose网络内部,您应该使用主机名app-mysql

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

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

答案 1 :(得分:0)

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

sail php artisan migrate

这意味着,您是从 docker 的 php 库中提示

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