Docker, PHP 8.4, Composer, Nginx 및 MariaDB를 사용한 간단한 환경 만들기
Source: Dev.to
이 플랫폼에서 첫 번째 기사 – 간단하고 실용적이며 따라하기 쉬운 내용을 목표로 합니다.
PHP 확장 설치, Nginx 설정, 혹은 로컬 데이터베이스 구축에 어려움을 겪어본 적이 있다면, Docker가 여러분의 삶을 훨씬 더 편리하게 만들어 줄 수 있습니다.
이 가이드에서는 단 한 번의 명령으로 실행되는 현대적이고 최소한의 개발 스택을 구축해 보겠습니다.
스택
- PHP 8.4 (FPM)
- Composer
- Nginx
- MariaDB
- Docker & Docker Compose
모든 서비스는 하나의 명령으로 함께 시작됩니다.
폴더 구조
root-folder/
├── docker/
│ ├── nginx/
│ │ └── default.conf
│ └── php/
│ └── Dockerfile
├── src/
│ └── index.php
├── docker-compose.yml
└── composer.json
| 폴더 | 책임 |
|---|---|
docker/php | 커스텀 PHP 이미지 및 확장 |
docker/nginx | Nginx 설정 |
src | 애플리케이션 소스 코드 |
1. PHP Dockerfile
docker/php/Dockerfile 생성:
# Base image with PHP 8.4 and FPM
FROM php:8.4-fpm
# Install system dependencies and PHP extensions
RUN apt-get update && apt-get install -y \
git \
unzip \
libzip-dev \
&& docker-php-ext-install pdo pdo_mysql zip
# Install Composer from the official image
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# Set the working directory
WORKDIR /var/www/html
동작 설명
- PHP 8.4‑FPM 사용(Nginx와 이상적인 조합).
- 일반적인 도구(
git,unzip)를 설치. - 필수 확장(
pdo,pdo_mysql,zip)을 활성화. - 수동 다운로드 없이 Composer를 추가.
2. Nginx 구성
Create docker/nginx/default.conf:
server {
listen 80;
index index.php index.html;
root /var/www/html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
핵심 포인트
- 포트 80에서 수신 대기합니다.
/var/www/html에서 파일을 제공합니다..php요청을 FastCGI를 통해 PHP 컨테이너로 전달합니다.
3. Docker‑Compose 파일
프로젝트 루트에 docker-compose.yml 파일을 생성합니다:
version: '3.9'
services:
php:
build: ./docker/php
container_name: php84
volumes:
- ./src:/var/www/html
depends_on:
- mariadb
nginx:
image: nginx:latest
container_name: nginx
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
mariadb:
image: mariadb:11
container_name: mariadb
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app
MYSQL_USER: app
MYSQL_PASSWORD: app
ports:
- "3306:3306"
volumes:
- mariadb_data:/var/lib/mysql
volumes:
mariadb_data:
설명
| 서비스 | 목적 |
|---|---|
php | 커스텀 PHP 8.4 이미지를 빌드하고, src/를 마운트하여 변경 사항이 즉시 반영되며, MariaDB가 시작될 때까지 대기합니다. |
nginx | 공식 Nginx 이미지를 사용하고, 호스트 포트 8080 → 컨테이너 포트 80을 매핑하며, 동일한 코드 볼륨을 공유하고, 커스텀 설정을 로드합니다. |
mariadb | MariaDB 11을 실행하고, 시작 시 데이터베이스와 사용자를 생성하며, 포트 3306을 노출합니다(선택 사항). 데이터는 명명된 볼륨(mariadb_data)에 저장됩니다. |
volumes | mariadb_data는 컨테이너 재시작 시에도 데이터베이스를 유지합니다. |
4. 샘플 PHP 애플리케이션
src/index.php 파일을 생성합니다:
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
echo "PHP is running and connected to MariaDB successfully!";
} catch (PDOException $e) {
echo "Database connection failed: {$e->getMessage()}";
}
- PDO를 사용합니다 (PHP에서 데이터베이스와 통신하는 권장 방법).
- 서비스 이름
mariadb를 통해 MariaDB에 연결합니다. - 연결이 성공하면 성공 메시지를 출력하고, 그렇지 않으면 오류를 표시합니다.
5. Composer 구성
composer.json 생성:
{
"name": "example/docker-php",
"require": {}
}
컨테이너 내부에서 Composer 실행
docker compose run --rm php composer install
이렇게 하면 Docker에 정의된 동일한 PHP 환경을 사용하므로 로컬 PHP 버전 문제를 피할 수 있습니다.
6. 전체 실행하기
프로젝트 루트에서:
docker compose up -d --build
브라우저를 열고 다음 주소에 접속하세요:
http://localhost:8080
다음과 같은 메시지가 표시됩니다:
PHP is running and connected to MariaDB successfully!
이 메시지가 나타나면 PHP, Nginx, MariaDB가 정상적으로 통신하고 있는 것입니다. 🎉
제공 내용
- PHP 8.4 개발 준비 완료
- Composer 완전 통합
- Nginx 경량 웹 서버
- MariaDB 영구 데이터 제공
- 깨끗하고 격리된 개발 환경
이는 순수 PHP 프로젝트와 API를 위한 견고한 시작점입니다.
오늘은 여기까지, 여러분!