728x90
반응형

Laravel & PHP 프로젝트 도커화: 다중 컨테이너 설정
주요 컨테이너 구성
1. Nginx 웹서버 컨테이너
server:
image: 'nginx:stable-alpine'
ports:
- '8000:80'
volumes:
- ./src:/var/www/html
- ./nginx/nginx.conf:/etc/nginx/nginx.d/default.conf:ro
depends_on:
- php
- mysql
- 역할: 들어오는 요청 처리, PHP 인터프리터로 전달
- 포트 매핑: 호스트 8000 → 컨테이너 80
- 볼륨:
- 소스코드 접근
- 커스텀 nginx 설정
2. PHP 인터프리터 컨테이너
php:
build:
context: .
dockerfile: dockerfiles/php.dockerfile
volumes:
- ./src:/var/www/html:delegated
- 역할: PHP 코드 실행, 요청 처리
- PDO 및 MySQL 확장 설치
- delegated 옵션: 성능 최적화를 위한 볼륨 마운트 설정
- build > context, dockerfile이 기본 형태와 다름
- Docker 빌드 시 context 경로가 루트 디렉토리가 됩니다.
- COPY 명령어는 이 context 디렉토리 내의 파일만 접근 가능합니다.
- context 디렉토리 외부의 파일은 접근할 수 없습니다.
- 그래서 기본 형태인 context: dockerfiles, dockerfile: php.dockerfile 로 지정하면
- php.dockerfile에서 COPY src .명령같은 상위에 접근하려는 명령어가 실패하게된다.
3. MySQL 데이터베이스 컨테이너
mysql:
image: mysql:5.7
env_file:
- ./env/mysql.env
- 환경 변수 파일
MYSQL_DATABASE=homestead
MYSQL_USER=homestead
MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=secret
유틸리티 컨테이너
1. Composer 컨테이너
composer:
build:
context: .
dockerfile: dockerfiles/composer.dockerfile
volumes:
- ./src:/var/www/html
- Laravel 프로젝트 생성 및 의존성 관리
- --ignore-platform-reqs 옵션으로 누락된 종속성 경고 무시
2. Artisan 컨테이너
artisan:
build:
context: .
dockerfile: dockerfiles/php.dockerfile
volumes:
- ./src:/var/www/html
entrypoint: ['php', '/var/www/html/artisan']
- Laravel의 CLI 도구
- 데이터베이스 마이그레이션, 시딩 등 명령 실행
3. npm 컨테이너
npm:
image: node:14
working_dir: /var/www/html
entrypoint: ['npm']
volumes:
- ./src:/var/www/html
- 프론트엔드 자산 관리
개발 vs 프로덕션 설정
개발 환경
- 바인드 마운트 사용:
- 실시간 코드 변경 반영
- 로컬 개발 편의성
프로덕션 환경
- COPY 명령어로 코드 포함
FROM nginx:stable-alpine
WORKDIR /etc/nginx/conf.d
COPY nginx/nginx.conf .
RUN mv nginx.conf default.conf
WORKDIR /var/www/html
COPY src .
- 배포 시 바인드 마운트 의존성 제거
- 컨테이너 독립성 확보
주요 명령어
1. Laravel 프로젝트 생성
docker-compose run --rm composer create-project --prefer-dist laravel/laravel .
2. 전체 애플리케이션 실행
docker-compose up -d server
- depends_on 설정으로 php, mysql 자동 시작
3. 이미지 재빌드
docker-compose up -d --build server
- Dockerfile 변경 사항 반영
4. 마이그레이션 실행
docker-compose run --rm artisan migrate
주요 고려사항
- Context 설정:
- Dockerfile에서 외부 파일 접근 시 context를 적절히 설정
- COPY 명령 사용 시 상위 폴더 접근 필요 시 context를 .으로 설정
- 컨테이너 간 통신:
- 같은 Docker Compose 네트워크 내에서 서비스 이름으로 통신
- Laravel .env 파일의 DB_HOST를 컨테이너 이름(mysql)으로 설정
- 파일 권한 설정:
- 프로덕션 환경에서는 적절한 파일 권한 설정 필요
RUN chown -R www-data:www-data /var/www/html
이 설정으로 복잡한 Laravel PHP 애플리케이션을 위한 완전한 개발/배포 환경을 구축할 수 있습니다.
전체 코드
docker-compose.yaml
version: "3.8"
services:
server:
# image: 'nginx:stable-alpine'
build:
context: .
dockerfile: dockerfiles/nginx.dockerfile
ports:
- '8000:80'
volumes:
- ./src:/var/www/html
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- php
- mysql
php:
build:
context: .
dockerfile: dockerfiles/php.dockerfile
volumes:
- ./src:/var/www/html:delegated
mysql:
image: mysql:5.7
env_file:
- ./env/mysql.env
composer:
build:
context: ./dockerfiles
dockerfile: composer.dockerfile
volumes:
- ./src:/var/www/html
artisan:
build:
context: .
dockerfile: dockerfiles/php.dockerfile
volumes:
- ./src:/var/www/html
entrypoint: ["php", "/var/www/html/artisan"]
npm:
image: node:14
working_dir: /var/www/html
entrypoint: ["npm"]
volumes:
- ./src:/var/www/html
./dockerfiles/composer.dockerfile
FROM composer:latest
WORKDIR /var/www/html
ENTRYPOINT [ "composer", "--ignore-platform-reqs" ]
./dockerfiles/nginx.dockerfile
FROM nginx:stable-alpine
WORKDIR /etc/nginx/conf.d
COPY nginx/nginx.conf .
RUN mv nginx.conf default.conf
# 복사하는 파일인 nginx.conf를 default.conf로 단순히 이름을 바꾼다
# 파일을 동일한 폴더로 이동시키면서 리네이밍함
WORKDIR /var/www/html
COPY src .
# src 폴더를 /var/www/html에 복사한다
./dockerfiles/php.dockerfile
FROM php:8.0-fpm-alpine
WORKDIR /var/www/html
COPY src .
RUN docker-php-ext-install pdo pdo_mysql
RUN chown -R www-data:www-data /var/www/html
참고
728x90
반응형
'강의 > Docker & Kubernetes : 실전 가이드' 카테고리의 다른 글
[114] Target 설정 (1) | 2025.03.26 |
---|---|
[104-112] 유틸리티 컨테이너에 대해서 (0) | 2025.03.24 |
[98-100] Docker Compose 명령어와 다중 컨테이너 구성 (0) | 2025.03.16 |
[95, 96] Docker Compose 파일 만들기 (0) | 2025.03.15 |
[94] Docker Compose : 무엇이며 왜 사용하는가? (0) | 2025.03.13 |
댓글