Section8 : 더 복잡한 설정: Laravel & PHP 도커화 프로젝트

tein·2022년 8월 6일
0

도커 & 쿠버네티스

목록 보기
10/14

목표
1. 도커를 제외하고
2. 호스트 머신에 아무것도 설치 하지 않고
3. Laravel 애플리케이션을 빌드할 수 있게 하는 설정

  • 도커를 사용하여 로컬 머신에 Laravel & PHP 프로젝트를 설정한다.
  • 컴퓨터에는 도커 외에 그 어떤 도구도 설치할 필요가 없도록 한다.
  • Docker compose를 사용하는 새로운 방식도 익힌다.
    • 이미지 간의 연결에 여러 Dockerfile을 사용하여 상호 작용하는 것 등

🎈Target 설정

  • Laravel != PHP
  • PHP를 설치하는 것만으로는 충분하지 않음
  • PHP로 서버 자체를 구축 할 수 없고,
  • 들어오는 요청을 처리하는 서버가 필요하기 때문
Host Machine Source Code Folder외에 
6개의 컨테이너를 갖게 된다.

1. MySQL Database
2. Nginx Web Server
3. PHP Interpreter

Utility 내부
4. npm
5. Laravel Artisan
6. Composer

🎈Nginx(웹서버) 컨테이너 추가

  • docker-compose.yaml 파일을 추가한다.
version: "3.8"

services: 
  server:
    # 텍스트를 따옴표로 묶으면 잘못된 방식으로 해석되지 않아 조금 더 안전하다.
    image: 'nginx:stable-alpine'
    ports: 
      - '8000:80'
    volumes: 
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
  # php:
  # mysql:
  # composer:
  # artisan:
  # npm:
  • 이 웹 서버에 대한 자체 구성 파일을 웹 서버 컨테이너에 전달 할 수 있다.
  • 호스트 머신에서 nginx 폴더 추가 후 nginx.conf 파일을 추가한다.
    • 추가할 파일은 강의파일에 올라와있음

🎈PHP 컨테이너 추가

  • php 컨테이너는 비교적 간단

  • 커스텀 Dockerfile 사용

  • nginx 폴더 근처에 dockerfiles 폴더 추가

  • dockerfiles 폴더 안에 php.dockerfile 추가

      FROM php:8.0-fpm-alpine
    
      WORKDIR /var/www/html
    
      RUN docker-php-ext-install pdo pdo_mysql
  • 여태 쓰던 Dockerfile은 맨 아래 CMD 명령이 있었지만 여기선 CMD나 ENTRYPOINT가 없음

    • CMD나 ENTRYPOINT가 없으면 베이스 이미지의 CMD나 ENTRYPOINT를 사용
  • Nginx에서 작성했던 docker-compose.yaml 파일에 php 내용을 추가한다.

     php:
       build:
         context: ./dockerfiles
         dockerfile: php.dockerfile
       volumes: 
         - ./src:/var/www/html:delegated
       # 3000을 9000으로 매핑하는 경우 필요하다.
       # 호스트머신 포트 : 컨테이너 내부 포트
       # ports:   
       #  - '3000:9000'
  • php 컨테이너와 통신하려는 것은 nginx 서버이므로 이름으로 참조하고,

  • ^ 이 경우에 이 포트는 컨테이너에 바로 연결된다.

  • ^ 이것은 로컬 호스트 머신에서 전송하는 경우가 아니므로 주석 처리한 매핑은 아무런 작업도 수행하지 않는다.

  • 대신 nginx.conf 파일의 포트를 9000으로 변경한다.

    • 컨테이너간 직접 통신을 하고 있기 때문
    • 로컬 호스트를 통한 통신 X
  • src 폴더도 만들어 둔다.

🎈MySQL 컨테이너 추가

  mysql:
    image: mysql:5.7
    env_file: 
      - ./env/mysql.env
  • 만들어둔 src 폴더 안에 env폴더를 만들고 mysql.env 파일을 만든다.
      MYSQL_DATABASE=homestead
      MYSQL_USER=homestead
      MYSQL_PASSWORD=secret
      MYSQL_ROOT_PASSWORD=secret

🎈 Composer 유틸리티 컨테이너 추가

  • Composer 컨테이너는 Laravel에 의해 내부적으로 사용된다.

  • 처음에 Laravel 애플리케이션을 설정하는데 사용할 수 있다.

  • dockerfiles폴더에 composer.dockerfile 추가한다.

    FROM composer:latest
    
    # 코드가 있을 곳
    WORKDIR /var/www/html
    
    ENTRYPOINT [ "composer", "--ignore-platform-reqs" ]
  • composer : ENTRYPOINT에 composer 파일을 넣은것. composer 실행파일은 composer 이미지와 컨테이너 내부에 존재한다.

  • --ignore-platform-reqs : 일부 종속성이 누락되더라도 경고나 오류 없이 실행 할 수 있다.

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

🎈Composer 유틸리티 컨테이너로 Laravel 앱 만들기

https://laravel.com/docs/9.x

  • composer를 사용하여 Laravel 프로젝트를 설정하므로 Your First Laravel Project 항목을 참고한다.
composer create-project laravel/laravel example-app
  • $] $] docker-compose run 뒤에 위의 명령어를 쓴다.
  • $] docker-compose run --rm composer create-project laravel/laravel .
    • composer.dockerfile의 ENTRYPOINT에 composer 실행파일이 있으므로 composer는 두번 쓸 필요가 없다
      • 첫번째는 서비스명, 두번째는 실행파일명
    • . : 프로젝트가 생성될 폴더를 명령의 끝에 특정한다.
      • composer.dockerfile 때문에 컨테이너 내부 폴더인 이곳에서 이 모두가 실행된다.
  • WORKDIR /var/www/html : Laravel 프로젝트가 생성되는 루프 폴더가 된다.

🎈일부 Docker Compose 서비스만 구동하기

  • Laravel 애플리케이션 내부에 있는 .env 파일에서 다음 부분을 수정한다.
  • MySQL 서버를 시작하기 위해 mysql.env 에서 설정한 값과 맞춘다.
  DB_CONNECTION=mysql
  DB_HOST=mysql
  DB_PORT=3306
  DB_DATABASE=homestead
  DB_USERNAME=homestead
  DB_PASSWORD=secret
  • $] docker-compose up server php mysql 입력한다.
    • 이렇게 하면 구동하고 싶은 서비스를 별도로 실행할 수 있다.
  • 모든 서비스 이름을 각각 지정하여 시작하는 것은 꽤 번거로우므로 종속성을 추가한다.
    • depends_on 을 추가한다.
  • 그리고 필요한 경우 이미지를 리빌드 하도록 하기 위해 --build 옵션을 추가한다.
    • $] docker-compose up --build server

🎈더 많은 유틸리티 컨테이너 추가하기

🎀artisan

  • artisan은 PHP로 빌드된 Laravel 명령이다.
    artisan:
      build:
        context: .
        dockerfile: dockerfiles/php.dockerfile
      volumes: 
        - ./src:/var/www/html
      entrypoint: ["php", "/var/www/html/artisan"]
    • entrypoint 옵션을 통해 Dockerfile에 아직 entrypoint가 없는 경우 오버라이드 하거나 추가할 수 있다.

🎀npm

  npm:
    image: node:14
    working_dir: /var/www/html
    entrypoint: ["npm"]
    volumes: 
      - ./src:/var/www/html
  • $] docker-compose run --rm artisan migrate 입력한다.
    • migrate : Laravel이 지원하는 artisan 명령 중 하나. 데이터베이스에 데이터를 기록한다. 따라서 데이터베이스 설정이 작동하는지 그 여부도 확인한다.
profile
내 시행착오 모음집

0개의 댓글