Docker를 사용하여 Laravel 환경 구축하기

 Docker 

Docker를 사용하여 Laravel 환경 구축하기

  • Laravel Valet을 사용하여 개발 진행하던 중, 문득 Docker를 사용해 보고 싶어서 정리하며 만들어본다.
  • Docker-compose 를 사용하여 nginx / mysql / app 각 컨테이너를 만든 후 한개의 컨테이너로 묶어 사용한다.

 

파일트리

  • laravel_docker
    • .env
    • Dockerfile
    • application
      • laravel source
    • docker-compose.yml
    • nginx
      • nginx.conf
        • laravel.conf

 

docker-composer.yml

docker-compose 명령어를 사용하면 docker-compose.yml 파일을 읽어 처리한다.

version: "3.7"
services:

#Laravel App
  app:
    build:
      args:
        user: mingyukim #로컬개발환경에서 echo $USER
        uid: 501 #로컬개발환경에서 echo $UID
      context: ./
      dockerfile: Dockerfile # 도커파일을 참조한다
    image: laravel-app
    restart: unless-stopped
    working_dir: /var/www/ #워킹디렉토리 설정
    volumes:
      - ./:/var/www #볼륨마운트 설정
    networks:
      - mynetwork

 #Nginx Service
  nginx:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - 8000:80 #80포트는 valet사용중임으로 8000:80 포트바인딩 해줌
    volumes:
      - ./:/var/www
      - ./nginx/conf.d:/etc/nginx/conf.d/
    networks:
      - mynetwork
  #Mysl Service
  db:
    image: mysql:5.7
    restart: unless-stopped
    ports:
      - 3307:3306 #로컬에서 3306 사용중이기 떄문에 포트바인딩해줌
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_USER: ${DB_USERNAME}
    networks:
      - mynetwork

networks:
  mynetwork:
    driver: bridge

 

 

Dockerfile

docker-compose.yml 파일의 app build시 구동하는 dockerfile로 php7.4-fpm 및 기본적인 프로그램을 설치해준다.

FROM php:7.4-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Set working directory
WORKDIR /var/www

USER $user

 

.env

docker-compose.yml의 db 및 APP 관련 값 셋팅

APP_NAME=Laravel
APP_ENV=local
APP_KEY= #라라벨 프로젝트 생성 후 .env파일의 App_KEY값 만들고 넣어주면 될듯
APP_DEBUG=true
APP_URL=http://localhost:8000 #위에서 설정한 port바인딩 입력
LOG_CHANNEL=stack
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=mingyu
DB_PASSWORD=abcd1234

 

 

docker-compose up -d --build 실행

docker-compose up -d --build 명령어를 사용하여 위에서 작성한 도커내용을 컨테이너화 시킨다.

$ docker-compose up -d --build

# 위 파일들을 수정하게 됬을 경우 번거롭게 컨테이너 이미지 지우지 말고 --force-recreate 옵션을 활용
$ docker-compose up -d --build --force-recreate

 

 

application 폴더 밑에 라라벨 프로젝트 생성

위 명령어를 통해 도커 컨테이너가 정상으로 작동한다면, application 폴더 밑에 라라벨 프로젝트를 생성해준다.

$ docker-compose exec app composer create-project laravel/laravel --prefer-dist application

그 후 application 폴더로 이동하여 .env에 app_key값을 확인 후, 없으면 만들고 있으면 laravel_docker 폴더의 .env에 넣어준다.

# laravel프로젝트의 APP_KEY값 확인하기
$ cd application
$ cat .env | grep ^APP_KEY

# 있다면 상위폴더의 .env의 APP_KEY에 넣어주기
# 없다면 생성하고 넣어주기
$ php artisan key:generate

 

nginx/conf.d/xxx.conf 만들기

# nginx/conf.d폴더 생성
$ mkdir -p nginx/{conf.d}

#본인은 laravel.conf 생성함
$ vi nginx/conf.d/laravel.conf



#laravel.conf
server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/application/public; #마운트된 볼륨 속 라라벨 프로젝트 설정
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

 

 

라라벨 프로젝트 .env 설정

application 폴더 밑의 라라벨 프로젝트의 .env를 자신의 개발환경에 맞게 설정하기

drwxr-xr-x  3 mingyukim  staff    96B  2 24 15:28 conf.d
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:+QEC4B/42U1jzW9o5ytBPaKjIZCxoMPdciMuP+a7qGw=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=db # 위에 설정한 .env의 DB_HOST 넣어주기
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=mingyu # 위에 설정한 .env의 DB_USERNAME 넣어주기
DB_PASSWORD=abcd1234 # 위에 설정한 .env의 DB_PASSWORD 넣어주기

BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DRIVER=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

 

 

마무리

localhost:8000으로 접속하면 라라벨 프로젝트가 잘 뜨는것을 확인 할 수 있다.

 

관련글