我写这docker-compose 项目。这docker-compose.yml看起来像这样:
version: '3.1'
services:
db:
image: mysql
restart: always
environment:
- MYSQL_DATABASE=mgsv
- MYSQL_USER=mgsv_user
- MYSQL_PASSWORD=mgsvpass
- MYSQL_ROOT_PASSWORD=mysql123
volumes:
- ./mysql:/docker-entrypoint-initdb.d
www:
build: ./mGSV
restart: always
ports:
- 8080:80
这索引.php 看起来像这样:
<?php
echo "Hello World!";
//mysqli_connect("localhost","my_user","my_password","my_db");
$con = mysqli_connect("localhost","mgsv_user","mgsvpass","mgsv");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
else {
echo "done";
}
?>
还有Dockerfile基于 PHP 容器,如下所示。
FROM php:5-apache
RUN apt-get update && apt-get install -y --no-install-recommends \
openjdk-7-jdk \
maven \
git \
&& rm -rf /var/lib/apt/lists/*
RUN docker-php-source extract \
&& docker-php-ext-install mysql mysqli pdo pdo_mysql \
&& docker-php-source delete
RUN cd /var/www/html/ && git clone https://github.com/qunfengdong/mGSV.git
# Move the folder 'mgsv' to DocumentRoot of Apache web server. By default, the DocumentRoot of Apache is /var/www/ (speak to the system administrator to know the exact DocumentRoot).
RUN cd /var/www/html/mGSV \
&& mkdir tmp \
&& chmod -R 777 tmp
RUN cd /var/www/html/mGSV && sed -i.bak "s|'gsv'|'mgsv_user'|" lib/settings.php \
&& sed -i.bak "s|$database_pass = ''|$database_pass = 'mgsvpass'|" lib/settings.php \
&& sed -i.bak "s|cas-qshare.cas.unt.edu|localhost|" lib/settings.php
RUN cp /var/www/html/mGSV/Arial.ttf /usr/share/fonts/truetype/
RUN cd /var/www/html/mGSV/ws \
&& tar -xzf mgsv-ws-server.tar.gz
RUN cd /var/www/html/mGSV/ws/mgsv-ws-server \
&& mvn package
RUN cp -f /var/www/html/mGSV/ws/mgsv-ws-server/target/ws-server-1.0RC1-jar-with-dependencies.jar /var/www/html/mGSV/ws/
RUN cd /var/www/html/mGSV/ws \
&& echo "mgsv_upload_url=http://localhost/mgsv" > config.properties \
&& echo "ws_publish_url=http\://localhost\:8081/MGSVService" >> config.properties \
&& java -jar ws-server-1.0RC1-jar-with-dependencies.jar &
COPY ./index.php /var/www/html/
RUN a2enmod rewrite
使用http://localhost:8080/
它时我得到的输出是:
Hello World!
Warning: mysqli_connect(): (HY000/2002): No such file or directory in /var/www/html/index.php on line 4
Failed to connect to MySQL: No such file or directory
我错过了什么?
先感谢您。
答案1
我相信这里的问题不是localhost
您的数据库主机。如果该 PHP 脚本在“www”docker 容器中运行,则localhost
很可能没有监听 MySQL 服务器。 IIRC,来自 mysqli 的“文件未找到”错误是由于在localhost
.我也没有看到您正在公开“db”图像的任何端口,因此我不确定“www”应该如何连接到其中运行的数据库。
您需要找到“db”docker 容器的地址以及它正在侦听的端口,然后在您的mysqli_connect()
函数中引用它。如果您有最新版本的 docker,一种更简单的方法是将容器添加到同一 Docker 网络并按名称引用它们。
编辑:Docker 网络
您应该阅读网络功能在官方文档中因为它非常有用。您可能可以使用以下 docker-compose.yml (未测试):
version: '3.1'
services:
db:
image: mysql
restart: always
environment:
- MYSQL_DATABASE=mgsv
- MYSQL_USER=mgsv_user
- MYSQL_PASSWORD=mgsvpass
- MYSQL_ROOT_PASSWORD=mysql123
volumes:
- ./mysql:/docker-entrypoint-initdb.d
networks:
- web-db-net
www:
build: ./mGSV
restart: always
ports:
- 8080:80
networks:
- web-db-net
networks:
web-db-net:
然后更改连接行以按名称引用数据库容器(如果不使用 MySQL 默认值 3306,您还需要指定端口):
$con = mysqli_connect("db","mgsv_user","mgsvpass","mgsv");
EDIT2:修复了 docker-compose.yml 以便网络实际工作
答案2
使用127.0.0.1
而不是localhost
.
localhost
在 mysqli 中具有特殊含义(来自MySqli 快速入门指南 - 连接):
主机名 localhost 有特殊含义。它与 Unix 域套接字的使用绑定。无法使用主机名 localhost 打开 TCP/IP 连接,您必须使用 127.0.0.1。
即,如果您使用localhost
mysqli,它将尝试使用 unix 套接字而不是使用 TCP 网络。由于 mysql 服务器未在本地运行,因此 unix 套接字文件不存在。现在错误有意义了。