Docker / WSL / Symfony / MySQL - SQLSTATE[HY000] [2002] 连接被拒绝

Docker / WSL / Symfony / MySQL - SQLSTATE[HY000] [2002] Connection refused

我正在使用 WSL 2 并尝试通过我的 docker 应用程序容器 (Symfony 4.4) 连接到我的 MySQL 数据库。关于这个主题的其他帖子并没有帮助我找到解决方案,这就是我现在问你的原因。不要犹豫,让我添加其他文件,这可以帮助我们获得有关此问题的更多信息。

所有容器表面上 运行 都很好 (details here)。

然后我进入我的应用程序容器 docker exec -it app-backend-fairfair bash 和 运行 composer install 并成功。它工作正常 (details here)。

最后我 运行 php bin/console doctrine:database:create 但即使我通过 localhost:8081 上的管理员拥有完整的数据库访问权限也无法正常工作,我仍然得到 SQLSTATE[HY000] [2002] Connection refused错误。完整的错误信息 here.


使用的文件

这是我的 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 文件中?

预先感谢您的帮助!

您的配置看起来不错,应该足以按预期工作。

该错误消息还表明网络设置正在运行,数据库主机可以解析,但它不接受连接。很可能数据库还没有准备好接受连接 。等待它完成初始化可能就足够了。

因此,通过检查该服务的日志输出来验证 mysql 服务是否已完成初始化:

docker-compose logs db

然后验证它正在接受本地 interface/unix 套接字上的连接:

docker-compose exec db mysql -u root -proot

接下来您可以验证 mysql 正在其(从容器的角度)外部接口上接受连接:

docker-compose run --rm db mysql -h db -u root -proot

谢谢@acran 的回答。我的问题只是关于找不到正确数据库路径的 .env 文件...!