2017-09-30 150 views
2

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

我试图在计算器和谷歌搜索,但没有找到任何有用的信息,所以我希望你们能帮助我。

奇怪的是,当我尝试使用JetBrains公司DataGrip与本地主机,MySQL和根,管理连接到MariaDB的,我可以连接到数据库,但不与PDO。

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

这里有下列项目文件:

这是我的搬运工,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 – Bart

+0

sqlite'改变''给我mysql'已经试过了,我得到找不到消息驱动程序。 – user3626278

+0

所以你需要安装/启用pdo mysql驱动 – Bart

回答

0

这是因为你正试图从你的php容器,它解析为达到与主机localhost数据库服务器PHP容器本身(与127.0.0.1相同)。

你应该改变你的$servername变量在您撰写的文件,例如等于你MariaDB的服务名称"mariadb"

在你的情况下每一个容器,在一个单一的默认网络之中,是由它的服务名称解析(除其他事项外),这就是为什么你不需要链接,这是有点过时。

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

+0

谢谢!改变本地主机为“mariadb”做了诡计! – user3626278

0

尝试创建自己的Dockerfile安装mysql分机。 静置泊坞窗撰写YML:

FROM php:7.1-fpm 

RUN docker-php-ext-install pdo pdo_mysql 

泊坞窗,compose.yml:

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

我已经这样做了,但是当连接mysql驱动程序和本地主机时,我得到以下内容:SQLSTATE [HY000] [2002]没有这样的文件或目录。我搜索并发现127.0.0.1应该修复它,但然后我得到SQLSTATE [HY000] [2002]连接被拒绝的错误。 – user3626278

+0

根据您的配置。你应该将mysql指向mysql,而不是localhost – Robert

+0

谢谢!安装驱动程序并将localhost更改为mysql有诀窍! – user3626278