【发布时间】: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,但那是什么意思呢?