이 블로그 글은 Docker 컨테이너 환경에서 발생한 PHP와 MariaDB 간의 연결 문제를 해결하는 과정을 다룹니다. 문제의 핵심은 "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->__construct('localhost', 'root', Object(SensitiveParameterValue),
'YourPlanet', NULL, '/run/mysqld/mys...')
Docker Compose 설정 파일을 통해 PHP와 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에 연결
MariaDB 컨테이너를 재시작하여 설정 파일의 변경 사항을 적용합니다.
docker restart ypdb
PHP 코드를 수정하여 TCP/IP 연결을 사용하도록 설정합니다.
<?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 컨테이너 간의 연결 문제를 성공적으로 해결했습니다.