상세 컨텐츠

본문 제목

docker-compose 로컬 PHP 개발 환경 구성하기

PHP

by devTak 2024. 5. 24. 15:11

본문

반응형

시스템 구성도

  • GIT Branch 관리 및 개발 편의성을 위해 실제 개발 프로젝트는 윈도우 로컬환경에 구성해둔다.
  • Docker Container 와 개발 프로젝트의 Volume 를 mount 하여 관리한다.

Docker-compose 파일 관리

Compose.yml

version: '3.8'
services:
  php:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: my-laravel-app
    working_dir: /var/www
    volumes:
      - C:\project\laravelProject:/var/www #마운트
    networks:
      - laravel-network
  nginx:
    image: nginx:alpine
    container_name: my-laravel-nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - C:\project\laravelProject:/var/www #마운트
    networks:
      - laravel-network
    depends_on:
      - php
    extra_hosts:
      - "test.co.kr:100.000.00.000" #필요한 호스트 등록
  mariadb:
    image: mariadb:10.4.21
    container_name: my-laravel-mariadb
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_USER: laraveluser
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - dbdata:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - laravel-network
  redis:
    image: redis:alpine
    container_name: my-laravel-redis
    ports:
      - "6379:6379"  # 호스트의 포트 3306을 컨테이너의 포트 3306에 매핑합니다.
    networks:
      - laravel-network
networks:
  laravel-network:
volumes:
  dbdata:
  • 시스템 구성도에서의 mount 는 php 와 nginx service 영역의 volume 을 통해 마운트를 진행한다.
  • hosts 등록이 필요한 경우 nginx service 영역에 extra_hosts 로 등록한다.
  • 포트 지정은 각 service 별로 ports 로 구성한다.
  • 네트워크 구성은 각 형태에 따라 구성한다. (networks)

PHP Dockerfile

FROM php:7.4-fpm
# Install system dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl
# Install PHP extensions
RUN apt-get update && apt-get install -y \
    libonig-dev \
    build-essential \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y \
    locales \
    zip \
    jpegoptim \
    optipng \
    pngquant \
    gifsicle \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y \
    vim \
    git \
    curl \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
RUN apt-get update && docker-php-ext-install \
        mbstring \
    && docker-php-ext-enable \
        mbstring
RUN apt-get update && docker-php-ext-install \
        exif \
    && docker-php-ext-enable \
        exif
RUN apt-get update && docker-php-ext-install \
        pcntl \
    && docker-php-ext-enable \
        pcntl
RUN apt-get update && docker-php-ext-install \
        bcmath \
    && docker-php-ext-enable \
        bcmath
RUN apt-get update && docker-php-ext-install \
        gd \
    && docker-php-ext-enable \
        gd
RUN apt-get install -y \
        libzip-dev \
        zip \
  && docker-php-ext-install zip
RUN apt-get update
# 필요한 패키지 설치
RUN apt-get update && apt-get install -y \
    curl \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y \
    && docker-php-ext-install pdo_mysql \
    && docker-php-ext-enable pdo_mysql
# RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
  • 각 Extension 별로 enable 과 install 을 해준다.
  • 해당 과정에서 서비스 에러가 발생할 경우 (ex. not found extension) 에러 구문에 맞는 패키지 설치가 필요하다.

Nginx Default.conf

server {
    listen 80;
    index index.php index.html;
    server_name localhost;
    root /var/www/public;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    location ~ /\.ht {
        deny all;
    }
}
  • nginx 에서 사용할 config 정보를 입력한다.

실행방법

// docker-compose 파일 내
docker-compose-up -d

My-laravel-app 터미널 접속

composer install
php artisan migrate

로컬 구축의 장단점

장점

  • 인터넷 환경에 구애받지 않는 개발 가능
  • 개발 및 서버 스테이지 환경과 관계없이 개발 가능
  • sync 방식의 업로드 형태가 아님에 따른 분리 개발 가능
  • 서버 이슈와 무관한 개발 가능
  • 서버 리소스 최소화

단점

  • 해당 프로젝트와 연관있는 API 통신의 방화벽 정책을 수립해야함
  • 개발 세팅 리소스 및 러닝커브 발생
  • git branch 운용방식의 변화가 필요

도커 커맨드 TIPs

// 도커 내리기
docker-compose down
// 도커 올리기
docker-compose up -d
// 도커 볼륨삭제
docker-compose down --volumes --remove-orphans
// 도커 이미지 강제 삭제
docker image prune --all --force
// 도커 컨테이너 목록
docker ps
// 도커 재빌드
docker-compose build
// 도커 특정 서비스 재시작
docker-compose restart {service}
반응형