首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker无法使用PHP连接mariadb

Docker无法使用PHP连接mariadb
EN

Stack Overflow用户
提问于 2017-09-30 23:49:43
回答 2查看 6.7K关注 0票数 7

我刚接触过Docker,一直在努力弄清楚如何用PHP连接到我的MariaDB容器,但没有成功。

我试图搜索堆栈溢出和谷歌,但找不到任何有用的信息,所以我希望你们可以帮助我。

奇怪的是,当我试图用本地主机、mysql、root和admin连接到MariaDB时,JetBrains DataGrip可以连接到数据库,但不能用PDO连接。

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

以下是以下项目文件:

这是我的docker-复合. file文件

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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文件

代码语言:javascript
复制
<?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();
    }

?>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-01 12:56:26

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

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

在您的示例中,位于单个默认网络中的每个容器都由其服务名称(以及其他一些内容)来解决,这就是为什么您不需要链接,因为这些链接有些不受欢迎。

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

票数 6
EN

Stack Overflow用户

发布于 2017-10-01 01:48:28

尝试创建自己的Dockerfile来安装mysql。把它放在一边,船坞组成了yml:

代码语言:javascript
复制
FROM php:7.1-fpm

RUN docker-php-ext-install pdo pdo_mysql

docker-compose.yml:

代码语言:javascript
复制
 php:
    build: .
    container_name: php
    links:
      - mariadb:mysql
    volumes:
      - ./public:/public
    ports:
      - "9000:9000"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46508038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档