Skip to main content

Command Palette

Search for a command to run...

[Docker] Laravel&php 도커화 프로젝트

Updated
2 min read
[Docker] Laravel&php 도커화 프로젝트

타켓 설정

이번에는 PHP, MYSQL, Nginx 컨테이너로 구성된 웹앱을 도커로 구축하면서 복잡한 설정에서 도커를 이용해 이들을 어떻게 간단히 할 수 있는지 설명한다,.

Nginx 컨테이너

우선 docker-compose.yaml을 만들어 두고 Nginx 부분은

version: "3.8"

services:
  server:
    image: "nginx:stable-alpine"
    ports:
      - "8000:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro

와 같이 작성한다. 도커허브에 있는 이미지를 사용하고, conf 파일은 읽기 전용으로 해놨다.

Nginx 설정이 여기서 크게 중요치는 않으나

server {
  listen 80;
  index index.php index.html;
  server_name localhost;
  root /var/www/html/public;
  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:3000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

와 같이 적어주었다.

PHP 컨테이너

php에 대한 도커파일을 dockerfiles 디렉토리에 넣고, 이름을 php.dockerfile이라 하자. (즉, dockerfiles/php.dockerfile)

php.dockerfile

FROM php:7.4-fpm-alpine

WORKDIR /var/www/html

RUN docker-php-ext-install pdo pdo_mysql

아래와 같이 해주었고,

그래서 이제 docker-compose.yaml에서 php부분을 작성해볼 차례인데

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

dockerfiles 디렉토리 내부에 있는 php.dockerfile이므로 빌드 부분은 위와 같이 적어줄 수 있겠고, src디렉토리를 /var/www/html로 마운트하도록 지정해준다.

여기서 delegated라는 것이 나오는데, 이건 성능 향상을 위해 쓰일 수 있는 것이다.

이건 컨테이너가 일부 데이터를 기록해야 하는 경우에 그 결과를 호스트 머신에 즉시 반영하는 게 아니라 배치로 기본 처리한다. 일종의 최적화 옵션으로 볼 수 있다.

그런데 위의 nginx.conf 파일에서 php가 3000번 포트를 쓰기를 기대하고 있는데 실제 php 이미지를 검색해보면 9000번 포트를 노출하고 있음을 찾을 수 있다. 그래서 9000번 포트를 3000번으로 매핑해주어야한다.

그래서

  php:
    build:
      context: ./dockerfiles
      dockerfile: php.dockerfile
    volumes:
      - ./src:/var/www/html:delegated
    ports:
      - "3000:9000"

이렇게 써주면 될 것 같지만, 사실 로컬호스트를 통해 통신하는 게 아니라 컨테이너끼리의 통신을 이루고자 하는 것이므로 docker-compose.yaml에 포트를 저렇게 기입해 둘 것이 아니라

nginx.conf에서

server {
  listen 80;
  index index.php index.html;
  server_name localhost;
  root /var/www/html/public;
  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

포트를 9000번으로 수정해주는 것이 옳다.

MySQL 컨테이너

MySQL의 경우 간단하다.

/env/mysql.env를 만들어주고 필요한 정보를 넣은 후

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

로 해주면 그만이다.

Composer 유틸리티 컨테이너

Laravel환경 구축을 위해 Composer 유틸리티 컨테이너도 만들어 볼 것이다.

이것도 간단하게 /dockerfiles/composer.dockerfile

FROM composer:latest

WORKDIR /var/www/html

ENTRYPOINT [ "composer", "--ignore-platform-reqs" ]

이것들을 적어준 후

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

로 유틸리티 컨테이너를 만들어줄 수 있다.

10 views

More from this blog

락프리 데이터 구조와 알고리즘

여기서는 락프리 데이터 구조를 설명한다. 락프리(lock-free) 란 배타락을 이용하지 않고 처리를 수행하는 데이터 구조 및 그에 대한 조작 알고리즘을 총칭한다. 왜 락프리인가? 전통적인 동시성 제어 방법인 뮤텍스나 세마포어는 여러 문제점을 가지고 있다: 성능 저하: 락 경합(lock contention)으로 인한 대기 시간 데드락: 여러 스레드가 서로의 락을 기다리는 상황 우선순위 역전: 낮은 우선순위 스레드가 높은 우선순위 스레드를 ...

Jul 27, 20257 min read126

소프트웨어 트랜잭셔널 메모리

소프트웨어 트랜잭셔널 메모리 동시성 프로그래밍에서 공유 자원에 대한 안전한 접근은 항상 중요한 과제다. 전통적으로 뮤텍스 락과 같은 비관적 락(Negative Lock) 방식을 사용해왔다. 이 방식은 크리티컬 섹션에 진입하기 전에 반드시 락을 획득해야 하며, 락을 얻지 못하면 코드 실행 자체가 블록된다. 하지만 이와는 다른 접근 방식이 있다. 바로 낙관적 락(Optimistic Lock) 방식인데, 이는 "일단 실행하고 나중에 검증하자"는 철학...

Jul 20, 202517 min read263

공평한 배타 제어

공평한 배타 제어 여기서는 공평한 배타 제어에 대해 설명한다. 먼저 컨텐션(contention) 이라는 개념을 이해할 필요가 있다. 컨텐션이란 여러 스레드가 동시에 같은 락을 획득하려고 경쟁하는 상황을 말한다. 컨텐션이 높을수록 스레드들이 락을 기다리는 시간이 길어지고 성능이 저하된다. 이러한 컨텐션 상황은 시스템 아키텍처에 따라 더욱 복잡해질 수 있다. 특히 비균일 메모리 접근(Non-Uniform Memory Access, NUMA) 와 같...

Jul 13, 20259 min read21

KernelSnitch[논문 리뷰]

Paper 1. Intro 이 글은 NDSS 2025에서 발표된 KernelSnitch 논문을 소개이다. 이 연구는 커널의 평범한 데이터 구조체들이 가진 본질적인 특성이 어떻게 심각한 보안 취약점이 되는지를 보여준다. 핵심은 이러하다: "데이터 구조체의 크기에 따른 접근 시간 차이를 이용해 커널의 비밀 정보를 유출할 수 있다" 여기서는 커널 힙 포인터 유출에 집중해서 설명한다. 이 공격이 성공하면 KASLR을 우회하고 더 심각한 커널 익스플로...

Jul 11, 20257 min read131

멀티태스크와 액터 모델

멀티태스크 협조적/비협조적 멀티태스크 선점: 프로세스와의 협조 없이 수행하는 컨택스트 스위칭이라고는 하나, 결국 뺏어오는 게 가능하냐의 문제다. 협조적 멀티태스크(비선점형, cooperative): 각각의 프로세스가 자발적으로 컨택스트 스위칭을 수행하는 멀티태스크 방식. 장점: 멀티태스크 매커니즘을 구현하기 쉽다. 단점: 프로세스가 자발적으로 컨텍스트 스위칭을 해야하는데, 만약 버그가 발생하여 프로세스가 무한 루프에 빠지거나 정지하게 되면 그 ...

Jul 6, 20252 min read25
M

MaxLog

35 posts