php在docker中找不到mysql服务器

8yparm6h  于 2021-06-23  发布在  Mysql
关注(0)|答案(3)|浏览(546)

因此,我有一套docker服务(在ubuntu上运行)目前几乎可以正常工作:
php/apache Web服务器
mysql服务器
phpmyadmin Web服务器
我在下面定义的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

最后是 `Dockerfile` 引用人 `docker-compose` 对于 `websrv` 服务:

FROM php:7.1.2-apache

RUN docker-php-ext-install mysqli

关于mysqli为什么不连接,我已经浏览了很多论坛帖子,但我还没有找到解决问题的答案。
我也尝试过获取docker容器的内部ip,但是没有任何运气。
我选择docker映像是因为我试图简单地让php&mysqli、phpmyadmin和mysql一起工作。三者的任何有效结合对我来说都是很好的,但令人惊讶的是,我还没有发现任何公开回购能够做到这一点。
谢谢你的指点。
fykwrbwg

fykwrbwg1#

我发现了我的问题:我做了一个php傻瓜。按照我编写文件的方式,变量是在函数外部定义的,当作用域更改为函数内部时,这些值要么未定义,要么为null。
解决这个公认愚蠢的问题的方法是将这些值定义放在函数中,就像这样。

<?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(); 导入此文件后。
谢谢大家的努力。

jgwigjjp

jgwigjjp2#

我不知道是否可以完全使用,但我的connectdb文件是:

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

kokeuurv3#

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

相关问题