微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Docker无法使用PHP连接到mariadb

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

我试图搜索stackoverflow和谷歌但找不到任何有用的信息,所以我希望你们能帮助我.

奇怪的是,当我尝试使用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();
    }

?>

解决方法:

这是因为您试图从您的PHP容器到主机名localhost到达数据库服务器,该容器解析为PHP容器本身(与127.0.0.1相同).

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

在您的情况下,位于单个认网络中的每个容器都通过其服务名称(以及其他内容)进行解析,这就是您不需要链接的原因,这些链接在某种程度上已被弃用.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐