私は書いたこれドッカー作成プロジェクト。これ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
これindex.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";
}
?>
しかもドッカーファイル以下のように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"ドッカーコンテナで実行されている場合、localhost
MySQLサーバーを受信しない可能性があります。 IIRC、mysqliの「ファイルが見つかりません」エラーはlocalhost
。その中で実行されるデータベース。
「db」dockerコンテナのアドレスとリッスンしているポートを見つけて、関数でmysqli_connect()
それを参照する必要があります。最新バージョンの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で特別な意味を持つ(fromMySqliクイックスタートガイド - 接続):
ホスト名 localhost は特別な意味を持ちます。これはUnixドメインソケットの使用に関連しています。ホスト名localhostを使用してTCP / IP接続を開くことはできません。 127.0.0.1を使用する必要があります。
つまり、localhost
mysqliを使用すると、TCPネットワークの代わりにUnixソケットを使用しようとします。 mysqlサーバーがローカルで実行されていないため、unixソケットファイルは存在しません。これでエラーが理解されました。