[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
    반응형

    댓글