Docker MYSQL'[2002]连接拒绝'

时间:2016-11-12 09:27:18

标签: php mysql symfony docker

我第一次尝试使用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网址:https://github.com/MolengraafFrank/DockerSymfony

有人可以帮帮我吗?谢谢你的时间。

6 个答案:

答案 0 :(得分:6)

'[2002]拒绝连接'意味着您可以访问数据库服务器,但您无权访问该用户(在您的情况下为admin)。默认情况下,mariadb有一个root用户,密码由MYSQL_ROOT_PASSWORD给出,该用户可以从任何服务器(%)连接。

如果要对数据库使用over login,则必须在数据库服务器中创建它,并在所选位置的数据库上正确授予。

一个过度的问题是,你为数据库服务器'mysql'提供了支持,默认情况下,phpmyadmin尝试连接到'db'。所以你必须添加

      PMA_HOST: mysql
给你Phpmyadmin环境。 如果你使用默认配置(与root连接到数据库服务器),我认为MYSQL_USERNAME和PMA_ARBITRARY是无用的

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我遇到了这个挑战,因为我正在运行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)

答案 4 :(得分:0)

在我的情况下,我正在将端口映射到主机mac(mysql)的Docker容器中运行3306:3306。我尝试使用127.0.0.1从phpmyadmin docker容器连接到该数据库。但这是行不通的,因为localhost码头集装箱上的phpmyadmin没有运行所需的mysql

要从docker网络连接到主机

docker.for.mac.host.internal

Docker Networking Docker Compose Networking

答案 5 :(得分:0)

就我而言,问题出在端口映射不知何故。

就我而言,它是 private static final BitSet ILLEGAL_CHARACTERS = new BitSet(); static { for (char c : new char[]{ '/','\n','\r','\t','\0','\f','`','?','*','\\','<','>','|','\"',':'}) { ILLEGAL_CHARACTERS.set(c); } } public static boolean fileNameIsValid(String fileName) { return fileName.chars().noneMatch(ILLEGAL_CHARACTERS::get); } ,只要我在右侧将其更改为 3307:3306,我就可以连接到数据库实例。