mysql - Docker / WSL / Symfony / MySQL - SQLSTATE [HY000] [2002] 连接被拒绝
问题描述
我正在使用 WSL 2 并尝试通过我的 docker 应用程序容器(Symfony 4.4)连接到我的 MySQL 数据库。关于这个主题的其他帖子没有帮助我找到解决方案,这就是我现在问你的原因。不要犹豫,让我添加其他文件,这可以帮助我们获取有关此问题的更多信息。
所有容器表面上都运行良好(详见此处)。
然后我进入我的应用程序容器docker exec -it app-backend-fairfair bash
并成功运行composer install
。它工作正常(细节在这里)。
最后我运行php bin/console doctrine:database:create
了,但即使我通过 localhost:8081 上的管理员拥有完整的数据库访问权限,它也无法工作,我仍然收到SQLSTATE[HY000] [2002] Connection refused
错误消息。完整的错误信息在这里。
使用的文件
这是我的 docker .env 文件:
SERVER_PORT=8080
ADMINER_PORT=8081
# name and group of your user
HOST_USER=shamzic
# Path to store data in your machine
MYSQL_VOLUME=/var/docker-volume/fairfair/database
# Password for root user
MYSQL_ROOT_PASSWORD=root
在 .env symfony 容器文件中:
...
DATABASE_URL=mysql://root:root@db:3306/main
...
docker-compose.yaml 文件:
version: '3.2'
services:
app-backend-fairfair:
build:
context: .
dockerfile: app.dockerfile
args:
USER: ${HOST_USER}
volumes:
- '../../:/usr/src/backend-fairfair'
networks:
- app-backend-fairfair
- db
restart: on-failure
container_name: app-backend-fairfair
server-backend-fairfair:
build:
context: .
dockerfile: server.dockerfile
networks:
- app-backend-fairfair
ports:
- ${SERVER_PORT}:80
restart: on-failure
depends_on:
- app-backend-fairfair
container_name: server-backend-fairfair
db:
image: mysql:8.0
build:
context: .
dockerfile: database.dockerfile
volumes:
- ${MYSQL_VOLUME}:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_HOST: '%'
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
networks:
- db
restart: on-failure
container_name: db
adminer:
build:
context: .
dockerfile: adminer.dockerfile
ports:
- ${ADMINER_PORT}:8080
restart: on-failure
networks:
- db
depends_on:
- db
container_name: adminer
networks:
app-backend-fairfair:
name: app-backend-fairfair
db:
name: db
我确信这可以通过一些更改来解决......也许在 docker-compose.yaml 文件中?
预先感谢您的帮助!
解决方案
您的配置看起来不错,应该足以按预期工作。
该错误消息还表明网络设置正在运行,并且可以解析 db 主机,但它不接受连接。很可能数据库还没有准备好接受连接。只是等待它完成初始化可能就足够了。
因此,通过检查该服务的日志输出来验证该mysql
服务是否已完成初始化:
docker-compose logs db
然后验证它是否接受本地接口/unix 套接字上的连接:
docker-compose exec db mysql -u root -proot
接下来,您可以验证 mysql 是否在其(从容器的角度)外部接口上接受连接:
docker-compose run --rm db mysql -h db -u root -proot
推荐阅读
- mimekit - 发送电子邮件耗时过长
- c# - Reinforced.Typings 在 MacOS 上找不到 dotnet.exe
- tox - 在 tox 中创建和使用临时目录
- python - Django - 在“TabularInline”中保存对象时出错,而主键是字符串并且是只读的
- node.js - 使用 oauth 对后端服务器进行身份验证,但该服务器位于专用 VLAN 上
- reactjs - 在 Material-UI 数据网格表中传递图像
- r - 难以将图例添加到我的图表中
- django - 带有 bootstrap4 的 django 中的酥脆形式看起来不那么漂亮?
- javascript - 返回真或假的函数
- tfs - TFS - 源代码控制>撤消挂起的更改... VS 2019