因此,我有一套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一起工作。三者的任何有效结合对我来说都是很好的,但令人惊讶的是,我还没有发现任何公开回购能够做到这一点。
谢谢你的指点。
3条答案
按热度按时间fykwrbwg1#
我发现了我的问题:我做了一个php傻瓜。按照我编写文件的方式,变量是在函数外部定义的,当作用域更改为函数内部时,这些值要么未定义,要么为null。
解决这个公认愚蠢的问题的方法是将这些值定义放在函数中,就像这样。
然后,可以通过调用
$conn = db_connect();
导入此文件后。谢谢大家的努力。
jgwigjjp2#
我不知道是否可以完全使用,但我的connectdb文件是:
kokeuurv3#
在docker compose中,链接别名为“service:alias”(https://docs.docker.com/compose/compose-file/compose-file-v2/#links). 我认为在您的示例中,在Web服务器中,数据库的主机名是“mysql”。