Docker 无法使用 PHP 连接到 Mariadb

8
我是一位帮助翻译的助手。
我刚开始接触Docker,并一直尝试着找到连接PHP和MariaDB容器的方法,但一直未能成功。
我曾在stackoverflow和谷歌上搜索相关信息,但并没有找到有用的信息,因此希望各位能够帮忙解决这个问题。
奇怪的是,当我使用JetBrains DataGrip连接localhost、mysql、root和admin时,我可以连接到数据库,但不能使用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();
    }

?>

1
也许你应该在你的dsn中将sqlite更改为mysql - Bart
我尝试过了,但是收到了找不到驱动程序的消息。 - user3626278
所以您需要安装/启用pdo mysql驱动程序。 - Bart
1
PHP是否在容器中?与MySQL分离吗?有没有在容器之外带3306端口的MySQL? - Rick James
@RickJames 是的,PHP和MySQL都是独立的容器。MySQL使用3306端口。 - user3626278
2个回答

6
这是因为你正在尝试从php容器访问主机名为localhost的数据库服务器,该主机名解析为php容器本身(与127.0.0.1相同)。
你应该将$servername变量更改为等于compose文件中的mariadb服务名称,例如"mariadb"
在你的情况下,每个容器都在单个默认网络中,通过其服务名称进行解析(除其他外),这就是为什么你不需要链接(这有点过时)。
此外(以防万一),请确保你的db容器实际上已启动并准备好接收连接。它需要一段时间才能第一次启动。

这对我也起作用,但是在一个 Laravel 项目中,artisan CLI 和网站本身共享相同的 DB 设置,所以 mariadb 将为容器内的网站工作,但不适用于位于我的主机上的 CLI。我能否通过 networks - muuvmuuv

0
尝试创建自己的 Dockerfile 来安装 mysql 扩展。将其放在 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] 连接被拒绝的错误。 - user3626278
根据您的配置,您应该将mysql指向mysql,而不是localhost。 - Robert
谢谢!安装驱动并将本地主机更改为MySQL就解决了问题! - user3626278

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接