MySQL에 연결할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

MySQL에 연결할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

나는 썼다이것도커 작성 프로젝트. 이것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" 도커 컨테이너에서 실행 중인 경우 localhostMySQL 서버를 수신하지 않을 가능성이 높습니다. 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.

localhostmysqli에서 특별한 의미를 갖는다(fromMySqli 빠른 시작 안내서 - 연결):

호스트 이름 localhost는 특별한 의미를 갖습니다. 이는 Unix 도메인 소켓 사용과 관련이 있습니다. 호스트 이름 localhost를 사용하여 TCP/IP 연결을 열 수 없습니다. 127.0.0.1을 사용해야 합니다.

즉, localhostmysqli를 사용하면 TCP 네트워크 대신 Unix 소켓을 사용하려고 시도합니다. mysql 서버가 로컬로 실행되고 있지 않기 때문에 unix 소켓 파일이 존재하지 않습니다. 이제 오류가 이해되었습니다.

관련 정보