php Docker MYSQL '[2002] Connection refused'

3bygqnnd  于 2024-01-05  发布在  PHP
关注(0)|答案(9)|浏览(239)

我第一次尝试Docker。启动并运行了LEMP堆栈,但我无法连接到MYSQL数据库。不是在我的Symfony应用程序上,不是在PHPMyAdmin上。应用程序返回以下错误代码:
驱动程序中发生异常:SQLSTATE[HY 000] [2002]连接被拒绝
这是我的docker-compose.yml:

nginx:
    image: tutum/nginx
    ports:
        - "80:80"
    links:
        - phpfpm
    volumes:
        - ./nginx/default:/etc/nginx/sites-available/default
        - ./nginx/default:/etc/nginx/sites-enabled/default

        - ./logs/nginx-error.log:/var/log/nginx/error.log
        - ./logs/nginx-access.log:/var/log/nginx/access.log
phpfpm:
    build: phpfpm/
    ports:
        - "9000:9000"
    volumes:
        - ./public:/usr/share/nginx/html
mysql:
  image: mariadb
  ports:
    - 3306:3306
  environment:
    MYSQL_ROOT_PASSWORD: admin
phpmyadmin:
  image: phpmyadmin/phpmyadmin
  restart: always
  links:
    - mysql
  ports:
    - 8183:80
  environment:
    MYSQL_USERNAME: admin
    MYSQL_ROOT_PASSWORD: admin
    PMA_ARBITRARY: 1

字符串
Dockerfile PHPFPM:

FROM php:fpm

RUN docker-php-ext-enable opcache
RUN apt-get update \
  && apt-get install -y --no-install-recommends libpq-dev \
  && docker-php-ext-install mysqli pdo_pgsql pdo_mysql


GitHub URL:https://github.com/MolengraafFrank/DockerSymfony
有人能帮帮我吗?谢谢你的时间。

c8ib6hqw

c8ib6hqw1#

我之所以面临这个挑战,是因为我正在使用不同的IP地址运行3个不同的容器

db - 172.18.0.3 - container for MYSQL
app - 172.18.0.2 - container for Laravel app

字符串
所以我修改了Laravel .env文件

DB_CONNECTION=mysql
DB_HOST=172.18.0.3
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=username
...


获取容器的IP地址。从你的Docker主机

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)


更新:对于最新的Docker版本,基于docker-compose.yml中的服务名称“mysql”

mysql:
  image: mariadb
  ports:
    - 3306:3306


你可以试试这个:

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=username


DB_HOST是在docker-compose.yml中定义的MySQL服务名称

2nbm6dog

2nbm6dog2#

"[2002] Connection refused“意味着您可以访问数据库服务器,但您没有该用户的权限(在您的示例中为admin)。默认情况下,mariadb有一个root用户,其密码由MYSQL_ROOT_PASSWORD给出,并且此用户可以从任何服务器(%)连接。
如果你想使用一个过度登录到你的数据库,你必须在数据库服务器中创建它,并在所选位置的数据库上授予权限。

这里的问题是您将数据库服务器命名为'mysql'(docker-compose文件中的服务名称)。但phpmyadmin默认尝试连接名为'db'的数据库服务器。在phpmyadmin服务的环境部分添加PMA_HOST: mysql可以解决此问题。

我认为MYSQL_USERNAME和PMA_ARBITRARY是无用的,如果您使用默认配置(与根连接到您的数据库服务器)

jei2mxaa

jei2mxaa3#

我使用mysql命令行工具连接到mysql示例,这是我使用的命令-mysql -u root -p -h 127.0.0.1,并输入管理员密码。这对你来说是足够的解决方案吗?

2izufjch

2izufjch4#

在我的例子中,我在一个端口Map到主机mac(3306:3306)的docker容器中运行mysql。我尝试使用127.0.0.1从phpmyadmin docker容器连接到这个数据库。但是它不起作用,因为phpmyadmin docker容器上的localhost没有运行所需的mysql
从Docker网络连接到主机

docker.for.mac.host.internal

字符串
Docker NetworkingDocker Compose Networking

btqmn9zl

btqmn9zl5#

对于我的例子,问题是与端口Map不知何故。
在我的例子中,它是3307:3306,只要我在右侧将它改为3307,我就可以连接到DB示例。

vs3odd8k

vs3odd8k6#

如果你想知道为什么你的连接失败,你可以在你的终端php**artisan tinker**然后像

DB::connection()->getPdo();

字符串
不幸的是,这只会给予你错误的一部分。退出修补程序,然后使用这个命令**php artisan db**将给予你更多的信息,如数据库类型,主机,端口,广告用户的问题。
像这样

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1:3306' (61)

   Symfony\Component\Process\Exception\ProcessFailedException 

  The command "'mysql' '--host=127.0.0.1' '--port=3306' '--user=root' '--default-character-set=utf8mb4' 'laravel'" failed.

Exit Code: 1(General error)

Working directory: /Users/Dev/Documents/www/laravel_docker/src/addressAPI

Output:
================

Error Output:
================

  at vendor/symfony/process/Process.php:270
    266▕      */
    267▕     public function mustRun(callable $callback = null, array $env = []): self
    268▕     {
    269▕         if (0 !== $this->run($callback, $env)) {
  ➜ 270▕             throw new ProcessFailedException($this);
    271▕         }
    272▕ 
    273▕         return $this;
    274▕     }

      +14 vendor frames 
  15  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))


这不会给给予你什么是错误的答案,但至少你可以理解为什么你的配置是错误的。

x6492ojm

x6492ojm7#

此答案为特殊情况的额外提示!

在突然出现错误的情况下,例如,在 * 之前一切都很好,但在停止某些容器或类似的过程中Docker的 * 更新 * 之后,MySQL容器的IP可能会改变,这可能会导致此类错误。在我的情况下,Laravel .env

DB_CONNECTION=mysql
DB_HOST=172.19.0.3
DB_PORT=3306
DB_DATABASE=db_name
DB_USERNAME=db_user
DB_PASSWORD=superSecret

字符串
而对于Yii 2应用程序来说,

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=172.19.0.3;dbname=db_name2',
    'username' => 'db_user',
    'password' => 'superSecret',
    'charset' => 'utf8',
];


我得到了这样的错误为两个应用程序,后他们工作正常.然而,运行docker inspect mysql其中mysql是mysql容器的名称显示在网络部分:

...
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.2",
...


因此,将主机IP从172.19.0.3更改为172.19.0.2可以解决问题。

ua4mk5z4

ua4mk5z48#

你需要将phpfpm容器连接到mysql。

af7jpaap

af7jpaap9#

添加DB_READ_HOST=db为我解决了这个问题

相关问题