mysql - SQLSTATE[HY000] [2002] 在 laravel 和 docker 设置上连接被拒绝
问题描述
我正在尝试为 laravel 开发设置一个 docker 环境。我遇到了 migrate 命令的问题。我正在向她粘贴 compose 文件和 env 文件。我认为我的设置是正确的,因为如果我从控制器执行正常的数据库操作,那么数据库连接工作正常。它仅使用 migrate 命令给出错误。我的撰写文件中也有工匠,因为我想将所有东西都保存在容器中。
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.29
container_name: mysql
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: homestead
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- ./mysql:/var/lib/mysql
networks:
- laravel
php:
build:
context: .
dockerfile: Dockerfile
container_name: php
volumes:
- ./src:/var/www/html
- ./src/php/ini:/usr/local/etc/php
ports:
- "9000:9000"
networks:
- laravel
artisan:
build:
context: .
dockerfile: Dockerfile
container_name: artisan
volumes:
- ./src:/var/www/html
depends_on:
- mysql
working_dir: /var/www/html
entrypoint: ['php', '/var/www/html/artisan']
networks:
- laravel
我的 env 文件看起来像这样
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=root
DB_PASSWORD=secret
我的码头文件看起来像
FROM php:7.3-fpm-alpine
WORKDIR /var/www/html
RUN docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable mysqli
当我跑
docker-compose run --rm artisan migrate
然后我得到
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations and table_type = 'BASE TABLE')
知道这里可能出了什么问题吗?
我还有一件事要分享,所以我正在编辑我的问题。
我执行了这个命令。
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
查找所有容器的 IP 地址。
我在 DB_HOST 中使用的 IP 地址如下
DB_CONNECTION=mysql
DB_HOST=172.19.0.2
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=root
DB_PASSWORD=secret
它奏效了,但这不是一个永久的解决方案。
不知何故,docker 无法将容器名称映射到内部 IP。
我不知道根本原因。
解决方案
我修复了在 .env DB_HOST 上放置容器示例名称的错误:
码头集装箱:
basic_mysql_1
.env
DB_HOST=basic_mysql_1
推荐阅读
- azure - Azure 应用服务 - 在 Jetty 上运行 Solr - Azure 维护后出现 LockObtainFailedException
- node.js - Node.js 错误 - AssertionError [ERR_ASSERTION]: 模式不应该使用全局或粘性模式...重新安装包后
- powerbi - powerBI 查找和子字符串
- java - SQSEvent 在 aws-lambda-java-events 1.x 中不存在并且 AmazonS3 在 aws-lambda-java-events 2.x 中不存在?
- r - R中的多个数据帧为空
- php - 从 url 获取 api json 数据
- javascript - 根据点击的元素触发不同的功能
- html - 页脚偏移中的数据表下拉列表
- html - 如何让两个垂直元素的高度之一取决于另一个?
- android - 如何使用 JDBC 驱动器将 MySql 表图像 (BLOB) 加载到 ImageView