PHP在Docker中找不到MySQL服务器

时间:2018-08-12 01:08:28

标签: php mysql docker mysqli docker-compose

因此,我有一组Docker服务(在Ubuntu上运行),这些服务目前几乎可以正常工作:

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

我在下面定义的docker-compose中设置了它们,并且PHPMyAdmin能够与SQL Server进行接口,但是使用下面的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一起工作。这三者的任何功能组合对我来说都是很好的选择,但令人惊讶的是,我还没有真正找到能够完成此任务的公共仓库。

感谢任何指针。

3 个答案:

答案 0 :(得分:0)

在docker compose中,链接别名为“服务:别名”(https://docs.docker.com/compose/compose-file/compose-file-v2/#links)。 我认为在您的示例中,在Web服务器中,数据库的主机名是“ mysql”。

答案 1 :(得分:0)

我不知道它是否可以用完,但是我的connectDB文件是:

<?php
$conn = mysqli_connect("localhost","root","password","nameDb");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
?>

答案 2 :(得分:0)

我发现了我的问题:我做了一个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();来建立连接。

感谢您的努力。