doudoulb1234 2018-08-12 01:08
浏览 166
已采纳

PHP在Docker中找不到MySQL服务器

So I have a set of Docker services (running on Ubuntu) that are almost working at the moment:

  • php/apache webserver
  • MySQL server
  • PHPMyAdmin webserver

I have them set up in the docker-compose defined below, and the PHPMyAdmin is able to interface with the SQL server, but using the PHP connection script below, and calling db_connect(), gives the following error page:

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 

File containing 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
", $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

and finally, the Dockerfile referenced by the docker-compose for the websrv service:

FROM php:7.1.2-apache

RUN docker-php-ext-install mysqli 

I've gone through a number of forum posts on why mysqli wouldn't connect, but I haven't found an answer that solves my problem yet.

I've tried getting the internal ip of the docker container as well, but I haven't had any luck.

My choice of the docker images was a result of me trying to simply get php & mysqli, phpMyAdmin, and MySQL all working together. Any functioning combination of the three would be great for me, but surprisingly I haven't really found any public repo that's done it yet.

Thanks for any pointers.

  • 写回答

3条回答 默认 最新

  • dqdfpmmi022763 2018-08-13 03:39
    关注

    I found my problem: I did a PHP goof. The way that I had my file written, the variables were defined outside of the function, and when the scope changed to inside the function, those values were all either undefined or null.

    The fix for this admittedly stupid problem is to put those value definitions inside the function, like so.

    <?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
    ", $conn->connect_error."<br>SESSION: ");
        print_r($_SESSION);
        session_destroy();
        unset($_SESSION);
        exit();
      }
      return $conn;
    }
    

    Then, the connection can be made by calling $conn = db_connect(); after the file this exists in has been imported.

    Thanks all for your efforts.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?