因此,我有一组Docker服务(在Ubuntu上运行),这些服务目前几乎可以正常工作:
我在下面定义的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一起工作。这三者的任何功能组合对我来说都是很好的选择,但令人惊讶的是,我还没有真正找到能够完成此任务的公共仓库。
感谢任何指针。
答案 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();
来建立连接。
感谢您的努力。