[115-124] Laravel & PHP 프로젝트 도커화: 다중 컨테이너 설정

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

 

 

주요 고려사항

  1. Context 설정:
    • Dockerfile에서 외부 파일 접근 시 context를 적절히 설정
    • COPY 명령 사용 시 상위 폴더 접근 필요 시 context를 .으로 설정
  2. 컨테이너 간 통신:
    • 같은 Docker Compose 네트워크 내에서 서비스 이름으로 통신
    • Laravel .env 파일의 DB_HOST를 컨테이너 이름(mysql)으로 설정
  3. 파일 권한 설정:
    • 프로덕션 환경에서는 적절한 파일 권한 설정 필요

  
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

 

 

 

 

참고

https://www.udemy.com/course/docker-kubernetes-2022

728x90
반응형

댓글