Docker 无法使用 PHP 连接到 mariadb

Posted

技术标签:

【中文标题】Docker 无法使用 PHP 连接到 mariadb【英文标题】:Docker can't connect to mariadb with PHP 【发布时间】:2018-03-12 11:50:02 【问题描述】:

我是 Docker 新手,一直试图弄清楚如何使用 php 连接到我的 MariaDB 容器,但没有成功。

我尝试在***和google上搜索,但找不到任何有用的信息,所以我希望你们能帮助我。

奇怪的是,当我尝试使用 JetBrains DataGrip 和 localhost、mysql、root、admin 连接到 MariaDB 时,我可以连接到数据库,但不能使用 PDO。

我真的希望你能帮助我,谢谢你的时间。

这里有以下项目文件:

这是我的 docker-compose.yml 文件

version: "3.1"
services:

  nginx:
    image: nginx:alpine
    container_name: nginx
    volumes:
      - ./config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"
    links:
       - php

  php:
    image: php:7.1-fpm
    container_name: php
    links:
      - mariadb:mysql
    volumes:
      - ./public:/public
    ports:
      - "9000:9000"

  mariadb:
    image: mariadb:10.1
    container_name: database
    environment:
      MYSQL_ROOT_PASSWORD: admin
    ports:
      - "3306:3306"

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    links:
      - mariadb
    ports:
      - 8183:80
    environment:
      PMA_HOST: mariadb
      PMA_USER: root
      PMA_PASSWORD: admin
      PMA_ARBITRARY: 1

我的 nginx.conf 文件:

server 
    listen 80 default;

    client_max_body_size 108M;

    access_log /var/log/nginx/application.access.log;


    root /public;
    index index.php;

    if (!-e $request_filename) 
        rewrite ^.*$ /index.php last;
    

    location ~ \.php$ 
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    


还有我的 index.php 文件

<?php

    $servername = "localhost";
    $username = "root";
    $password = "admin";
    $database = "mysql";

    try 
        $conn = new PDO("sqlite:host=".$servername.";dbname=" . $database, $username, $password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $sql = $conn->prepare("SELECT * FROM testDB");
        $sql->execute();

        while($result = $sql->fetch(PDO::FETCH_ASSOC))
            $result['myTestData'];
        

    
    catch(PDOException $e) 
        echo "Connection failed: " . $e->getMessage();
    

?>

【问题讨论】:

也许你应该在你的 dsn 中将 sqlite 更改为 mysql 我试过了,我得到了找不到驱动程序的消息。 所以你需要安装/启用pdo mysql驱动 PHP 在容器中吗?与 MySQL 分开?容器外是否有带 3306 的 MySQL? @RickJames 是的,PHP 和 MySQL 都是独立的容器。 MySQL 使用 3306 端口。 【参考方案1】:

这是因为您试图从您的 php 容器中访问主机名为 localhost 的数据库服务器,该服务器解析为 php 容器本身(与 127.0.0.1 相同)。

您应该将您的 $servername 变量更改为等于您撰写文件中的 mariadb 服务名称,例如"mariadb".

在您的情况下,位于单个默认网络中的每个容器都由其服务名称(除其他外)解析,这就是您不需要链接的原因,这在某种程度上已被弃用。

另外(以防万一)确保您的数据库容器已实际启动并准备好接收连接。第一次开始需要一段时间。

【讨论】:

这也适用于我,但我在一个 laravel 项目中存在一个小问题,其中工匠 CLI 和网站本身共享相同的数据库设置。所以mariadb 将适用于容器内的网站,但不适用于位于我主机上的 CLI。我可以不告诉 mariadb 通过networks 向 PHP 上的 localhost 公开吗?【参考方案2】:

尝试创建自己的Dockerfile 来安装mysql ext。 docker compose yml 放在一边:

FROM php:7.1-fpm

RUN docker-php-ext-install pdo pdo_mysql

docker-compose.yml:

 php:
    build: .
    container_name: php
    links:
      - mariadb:mysql
    volumes:
      - ./public:/public
    ports:
      - "9000:9000"

【讨论】:

我已经这样做了,但是当连接 mysql 驱动程序和本地主机时,我得到以下信息: SQLSTATE[HY000] [2002] 没有这样的文件或目录。我搜索并发现 127.0.0.1 应该修复它,但后来我得到 SQLSTATE[HY000] [2002] Connection denied 错误。 根据您的配置。您应该将 mysql 指向为 mysql,而不是 localhost 谢谢!安装驱动程序并将 localhost 更改为 mysql 就可以了!

以上是关于Docker 无法使用 PHP 连接到 mariadb的主要内容,如果未能解决你的问题,请参考以下文章

docker nginx和php,php无法连接到localhost

无法在本地环境中使用 docker 连接到 cakephp 中的 mysql 数据库

docker-compose 中的“无法连接到本地 MySQL 服务器”

在docker上使用laravel时无法连接到mysql数据库(未找到,pdo,连接被拒绝)

我需要一个可以使用 php 连接到外部 MYSQL 数据库的 docker 映像

无法使用 SSH 连接到 docker 容器 [关闭]