Docker MYSQL '[2002] Connection deny'

2022-08-30 16:29:17

我是第一次尝试 Docker。已启动并运行 LEMP 堆栈,但我无法连接到 MYSQL 数据库。不在我的Symfony应用程序上,不在PHPMyAdmin上。应用程序返回以下错误代码:

驱动程序中发生异常:SQLSTATE[HY000] [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

有人可以帮助我吗?感谢您抽出宝贵时间接受采访。


答案 1

“[2002] 连接被拒绝”意味着您可以访问数据库服务器,但您没有用户(在您的情况下是管理员)的正确访问权限。默认情况下,mariadb 有一个 root 用户,其密码由 MYSQL_ROOT_PASSWORD 并且此用户可以从任何服务器连接 (%)。

如果要使用数据库的过度登录,则必须在数据库服务器中创建它,并授予从所选位置对数据库的权限。

这里的问题是,您已将数据库服务器命名为“mysql”(docker-compose 文件中的服务名称)。但缺省情况下,phpmyadmin 会尝试连接到名为“db”的数据库服务器。在 phpmyadmin 服务的环境部分下添加PMA_HOST:mysql 将解决此问题。


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

答案 2

我遇到了这个挑战,因为我正在运行3个不同的容器,具有不同的IP地址

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 版本,基于服务名称“mysql”,在您的 docker-compose.yml 中

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 服务名称的名称


推荐