Laravel 도커 빌드하기

wangjh789·2022년 8월 26일
0

docker

목록 보기
18/25

php는 node와 달리 서버를 만들 수 없어 nginx를 사용해야 한다.

애플리케이션 컨테이너

Server

  • server 컨테이너는 nginx서버로 들어오는 요청을 받아 PHP 인터프리터를 트리거 한다.
  • 들어오는 요청을 살펴보고 php 컨테이너로 전달하는 것.
  • root /var/www/html/public : 들어오는 요청에 응답하는데 사용할 수 있는 파일을 찾을 디렉토리이다.
  • nginx는 php파일을 찾아야 하기 때문에 라라벨 애플리케이션의 디렉토리에 접근해야 하므로 라라벨 어플리케이션에 미러링된 src 에 대해 마운트바인딩을 해야한다.
  • config 파일을 로컬로부터 퍼가기 위해 마운트바인딩 한다.
  server: 
    image: 'nginx:stable-alpine'
    ports:
      - '8000:80'
    volumes:
      - ./src:/var/www/html
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro

php

  • php 컨테이너는 php코드와 Laravel 코드(PHP 프레임워크)를 실행한다.
  • nginx 구성을 위해선 php-fpm 이미지가 필요하다.
  • php 뿐 아니라 필요한 부가 종속성 까지 설치한 컨테이너다.
  • /var/www/html 은 웹 사이트를 제공하는 웹 서버의 표준적인 폴더를 워킹디렉토리로 정한다.
  • 만약 도커파일에 CMD나 ENTRY_POINT가 없으면 베이스이미지의 명령을 수행한다.
    (php의 디폴트 명령은 php인터프리터를 호출하는 것, 따라서 php 파일이 들어오면 처리된다.)
  • 도커 컴포즈에서 라라벨 소스코드가 들어갈 디렉토리와 마운트바인딩을 설정한다.
    (delegated는 컨테이너가 코드를 변경했을 떄 즉시 호스트 머신에 반영하는게 아니라 한번에 batch로 반영, 최적화 옵션 )
  • 라라벨 프레임워크는 실행될 떄 특정 파일을 생성하기에 read-write 볼륨으로 지정한다.
  • 원래 상황은 nginx가 nginx.cof에 명시된 포트로 php컨테이너에게 해석할 파일을 보내면 php는 9000번(default)로 받아 이를 처리하지만 도커 컴포즈를 사용하므로 같은 도커 네트워크 상에 존재해 expose로 생략하고 nginx.conf에서 php:9000 으로 내부적으로 직접 통신할 수 있다.
    (만약 호스트 머신에서 php컨테이너와 통신하려면 expose가 필요하다)
  php:
    build: 
      context: ./dockerfiles
      dockerfile: php.dockerfile
    volumes:
      - ./src:/var/www/html:delegated

mysql

mysql 는 db

  mysql:
    image: mysql:5.7
    env_file:
      - ./env/mysql.env

유틸리티 컨테이너

composer

composer 컨테이너를 통해 라라벨 애플리케이션을 만든다.

  composer:
    build: 
      context: ./dockerfiles
      dockerfile: composer.dockerfile
    volumes:
      - ./src:/var/www/html

docker-compose run --rm composer create-project --prefer-dist laravel/laravel . 을 수행하면 라라벨 애플리케이션이 src/ 디렉토리에 설치된다.

composer컨테이너는 다음은 명령을 수행한다.
composer --ignore-platform-reqs create-project --prefer-dist laravel/laravel /var/www/html

생성된 .env 파일 중 DB 연결관련한 환경설정을 변경한다.

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

artisan : laravel 초기 데이터

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:1400
    working_dir: /var/www/html
    entrypoint: ['npm']
    volumes:
      - ./src:/var/www/html
profile
기록

0개의 댓글