首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony 4使用Docker容器产生SQLSTATE[HY000] [2002]连接被拒绝

Symfony 4使用Docker容器产生SQLSTATE[HY000] [2002]连接被拒绝
EN

Stack Overflow用户
提问于 2018-03-19 08:44:14
回答 2查看 4.2K关注 0票数 2

我有2个Docker容器,使用以下配置:

代码语言:javascript
复制
version: '2'

volumes:
  db_data: {}

services:

  db:
    container_name: database-mysql-5.7
    build:
      context: ./docker/db/
    ports:
      - "3321:3306"
    volumes:
      - db_data:/var/lib/mysql

  web:
    container_name: apache-symfony-4
    build:
      context: ./docker/web/
    image: php
    links:
      - db
    depends_on:
      - db
    ports:
      - "8021:80"
    volumes:
      - ./app/:/var/www/symfony

我可以从本地主机(Mac OS)连接到db容器,并且可以从web容器连接到db容器(并成功执行sql语句)。此外,当我执行到web容器时,我可以成功地执行doctrine:migrations:diff命令。

但是,当我尝试运行如下代码时:

代码语言:javascript
复制
$User = $this->getDoctrine()
                ->getRepository(User::class)
                ->findAll();

我收到以下错误:

代码语言:javascript
复制
An exception occurred in driver: SQLSTATE[HY000] [2002] Connection refused

octrine\DBAL\Exception\ConnectionException:
An exception occurred in driver: SQLSTATE[HY000] [2002] Connection refused

  at vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:108
  at Doctrine\DBAL\Driver\AbstractMySQLDriver->convertException('An exception occurred in driver: SQLSTATE[HY000] [2002] Connection refused', object(PDOException))
     (vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php:176)
  at Doctrine\DBAL\DBALException::wrapException(object(Driver), object(PDOException), 'An exception occurred in driver: SQLSTATE[HY000] [2002] Connection refused')
     (vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php:161)
  at Doctrine\DBAL\DBALException::driverException(object(Driver), object(PDOException))
     (vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOMySql/Driver.php:47)

下面是我的.env文件的内容

代码语言:javascript
复制
# This file is a "template" of which env vars need to be defined for your application
# Copy this file to .env file for development, create environment variables when deploying to production
# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration

###> symfony/framework-bundle ###
APP_ENV=dev
APP_SECRET=7c2deaf7464ad40b484d457e02a56918
#TRUSTED_PROXIES=127.0.0.1,127.0.0.2
#TRUSTED_HOSTS=localhost,example.com
###< symfony/framework-bundle ###

###> symfony/swiftmailer-bundle ###
# For Gmail as a transport, use: "gmail://username:password@localhost"
# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode="
# Delivery is disabled by default via "null://localhost"
MAILER_URL=null://localhost
###< symfony/swiftmailer-bundle ###

###> doctrine/doctrine-bundle ###
# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
# Configure your db driver and server_version in config/packages/doctrine.yaml
DATABASE_URL=mysql://hereswhatsontap:####@db:####/hereswhatsontap
###< doctrine/doctrine-bundle ###

此外,如果我尝试使用DBAL,它会返回相同的错误:

代码语言:javascript
复制
/**
     * @Route("/test")
     */
    public function testAction(Connection $connection){
        $users = $connection->fetchAll('SELECT * FROM users');

        return $this->render("startup/startup.html/twig", [
            "NewUser" => $users
        ]);
    }

尝试使用root用户名/密码也会失败。

好的,最后一个附加数据(我保证:)

在Symfony的/public文件夹中执行以下代码可以正常工作

代码语言:javascript
复制
<?php
$dsn = 'mysql:host=db;dbname=hereswhatsontap;';
$username = 'hereswhatsontap';
$password = '####';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);

$dbh = new PDO($dsn, $username, $password, $options);

$sql = "SELECT * from user";
$statement = $dbh->prepare($sql);
$statement->execute();
$users = $statement->fetchAll(2);
print_r($users);
?>
EN

回答 2

Stack Overflow用户

发布于 2018-08-04 18:36:39

非常感谢你的评论,它为我节省了几个小时的研究时间。我只想为像我这样的Docker新手补充一句,如果你想获得你的容器IP,你可以运行以下命令(这样你就不需要在只使用inspect获得的整个配置转储中查找):

代码语言:javascript
复制
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' YOURCONTAINERID

再次感谢!

票数 4
EN

Stack Overflow用户

发布于 2018-03-26 22:21:46

这个问题是由于我完全不了解容器之间是如何相互通信造成的。

web容器和db容器基本上在它们自己的'vpn‘网络上,这意味着web容器可以直接与db通信,然后将基于我的配置使用内部端口(3306)。

因此,从.env文件的DATABASE_URL值中删除端口(我将其作为外部端口)就是答案。

见鬼!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49354309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档