PHP 在 Docker 中找不到 MySQL 服务器

标签 php mysql docker mysqli docker-compose

所以我有一组目前几乎可以工作的 Docker 服务(在 Ubuntu 上运行):

  • php/apache 网络服务器
  • MySQL服务器
  • PHPMyAdmin 网络服务器

  • 我在下面定义的 docker-compose 中设置了它们,PHPMyAdmin 能够与 SQL 服务器交互,但使用下面的 PHP 连接脚本,并调用 db_connect() ,给出以下错误页面:
    Warning: mysqli::__construct():(HY000/2002): No such file or directory in /var/www/html/api/sql_db.php on line 12
    MySQLi Connection failed: No such file or directory
    SESSION: Array ( [sql_server] => db [username] => root[password] => test [dbname] => bravo 
    

    包含 db_connect() 的文件:
    <?php
    session_start();
    $servername = "db";
    $username = "root";
    $password = "test";
    $dbname = "bravo";
    $_SESSION['sql_server'] = $servername;
    $_SESSION['username'] = $username;
    $_SESSION['password'] = $password;
    $_SESSION['dbname'] = $dbname;
    function db_connect(){
      $conn = new mysqli($servername, $username, $password, $dbname);
      if ($conn->connect_errno) {
        printf("MySQLi Connection failed: %s\n", $conn->connect_error."<br>SESSION: ");
        print_r($_SESSION);
        session_destroy();
        unset($_SESSION);
        exit();
      }
    }
    
    docker-compose.yml :
    version: '3'
    
    services:
      db:
        image: mysql:5.7.23
        container_name: db
        command: --default-authentication-plugin=mysql_native_password
        ports: 
          - 3306:3306
        environment:
          MYSQL_DATABASE: bravo
          MYSQL_USER: user
          MYSQL_PASSWORD: test
          MYSQL_ROOT_PASSWORD: test
        restart: always
        volumes:
          - ./dump:/docker-entrypoint-initdb.d
          - ./db/data/mysql:/var/lib/mysql
        networks: 
          - default
    
      phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links: 
          - db
        ports:
          - 8000:80
        environment:
          MYSQL_USER: user
          MYSQL_PASSWORD: test
          MYSQL_ROOT_PASSWORD: test
        depends_on:
          - db
    
      websrv:
        build: .
        ports: 
          - 8080:80
        volumes:
          - ./www:/var/www/html
        links:
          - db
        networks:
          - default
        depends_on:
          - db
    

    最后是 Dockerfiledocker-compose 引用对于websrv服务:
    FROM php:7.1.2-apache
    
    RUN docker-php-ext-install mysqli 
    

    我已经浏览了许多关于为什么 mysqli 无法连接的论坛帖子,但我还没有找到解决我问题的答案。

    我也尝试过获取 docker 容器的内部 ip,但我没有任何运气。

    我选择 docker 镜像是因为我试图简单地让 php & mysqli、phpMyAdmin 和 MySQL 一起工作。这三者的任何功能组合对我来说都很棒,但令人惊讶的是,我还没有真正找到任何已经完成的公共(public) repo 。

    感谢您的任何指示。

    最佳答案

    我发现了我的问题:我做了一个 PHP 错误。
    我编写文件的方式是在函数外部定义变量,当范围更改为函数内部时,这些值要么未定义要么为空。

    这个公认的愚蠢问题的解决方法是将这些值定义放在函数中,就像这样。

    <?php
    function db_connect(){
      $servername = "db";
      $username = "root";
      $password = "test";
      $dbname = "bravo";
    
      $conn = new mysqli($servername, $username, $password, $dbname);
      if ($conn->connect_errno) {
        printf("MySQLi Connection failed: %s\n", $conn->connect_error."<br>SESSION: ");
        print_r($_SESSION);
        session_destroy();
        unset($_SESSION);
        exit();
      }
      return $conn;
    }
    

    然后,可以通过调用 $conn = db_connect(); 来建立连接。导入该文件后。

    感谢大家的努力。

    关于PHP 在 Docker 中找不到 MySQL 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51804951/

    相关文章:

    php - $_POST 网站崩溃

    docker - 与 Ubuntu 相比,为什么 SLES 12 上的 docker 容器占用 2 倍内存?

    javascript 删除字符串上的页眉和页脚

    php - 如何在PHP中获取html&lt;input type ="hidden">的值?

    php - 如何在关联数组中正确使用 implode()

    mysql - 与 mysql 总和关联的日期范围在 Crystal 报表过滤器中变得无效

    PHP mySQL preg_replace 字符串并存储结果

    mysql - 编写子查询而不是连接 MySQL

    wordpress - Docker Compose Windows 10 - 容器启动,没有文件可见

    docker - Firefox Headless 无法以非 root 用户身份在 Docker 中工作