Docker 컨테이너에서 발생한 PHP와 MariaDB 연결 오류 "No such file or directory"

밤새·2023년 10월 15일
0

에러 모음

목록 보기
8/17

이 블로그 글은 Docker 컨테이너 환경에서 발생한 PHP와 MariaDB 간의 연결 문제를 해결하는 과정을 다룹니다. 문제의 핵심은 "No such file or directory"라는 소켓 연결 오류였습니다.

⚠️ 문제: "No such file or directory" 오류

🤔 에러 내용 및 원인

PHP와 MariaDB 컨테이너 간의 연결 시 소켓 경로가 정확하지 않아 발생한 오류였습니다. PHP 컨테이너가 직접 호스트의 소켓을 참조하려 했지만 MariaDB 컨테이너와는 분리되어 있어 발생한 문제였습니다.

🔍 에러 내용

<b>Fatal error</b>: Uncaught mysqli_sql_exception: No such file or directory in /var/www/html/db/connect.php:8
Stack trace:
#0 /var/www/html/db/connect.php(8): mysqli-&gt;__construct('localhost', 'root', Object(SensitiveParameterValue),
'YourPlanet', NULL, '/run/mysqld/mys...')

🔍 에러 원인

  • PHP 컨테이너가 MariaDB와 소켓을 공유하지 않아 발생한 문제.
  • PHP 컨테이너가 localhost를 MariaDB의 소켓 위치로 인식하지 못했음.

에러 해결 방법

단계 1: Docker Compose 설정 수정

Docker Compose 설정 파일을 통해 PHP와 MariaDB 컨테이너 간의 네트워크 연결을 설정합니다.

1-1. MariaDB 설정 파일 수정

루트 폴더에서 MariaDB 설정 파일 (my.ini)을 만들어 소켓 파일 경로를 설정합니다.

  • my.ini 파일의 [client-server] 섹션에서 socket 옵션을 활성화하고 올바른 소켓 파일 경로를 설정합니다.
[mysqld]
port=3308
[client]
port=3308
socket= /run/mysqld/mysqld.sock
  • 그 후 docker-compose.yml파일에 경로를 추가 해줍니다.
  db:
    image: mariadb:latest
    container_name: ypdb
    ports:
      - 3310:3308
    environment:
      MYSQL_DATABASE: YourPlanet
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: **  # 루트 패스워드 지정
    volumes:
      - "./scripts/schema.sql:/docker-entrypoint-initdb.d/1.sql"
      - "./my.ini:/etc/mysql/my.ini"   
      # 호스트의 my.ini 파일을 컨테이너 내의 /etc/mysql/my.ini에 복사
      
    networks:
      - my-network  # my-network에 연결

단계 2: MariaDB 컨테이너 재시작

MariaDB 컨테이너를 재시작하여 설정 파일의 변경 사항을 적용합니다.

docker restart ypdb

단계 3: PHP 코드 수정

PHP 코드를 수정하여 TCP/IP 연결을 사용하도록 설정합니다.

PHP 코드 수정 예시:

<?php
$servername = "db";  // MariaDB 컨테이너의 서비스 이름을 사용
$name = "root";
$password = "**";
$dbname = "YourPlanet";

$conn = new mysqli($servername, $name, $password, $dbname);

if ($conn->connect_error) {
    die("데이터베이스 연결 실패: " . $conn->connect_error);
}
?>

이렇게 해결함으로써, PHP와 MariaDB 컨테이너 간의 연결 문제를 성공적으로 해결했습니다.

profile
프로젝트를 통해 배운 개념이나 겪은 문제점들을 정리하고, 회고록을 작성하며 성장해나가는 곳입니다 😊

0개의 댓글