Docker compose를 사용한 Nginx PHP Mariadb 서버 만들기

Docker compose 설치

Docker가 이미 설치된 Debian에서 Docker compose를 설치하는 방법입니다.

Docker 설치하기 링크로 이동하시면 더욱 자세한 가이드가 있습니다.
sudo apt install docker-compose-plugin

아래 모든 작업은 사용자 환경에서 작업하는 Docker compose를 기반으로 합니다.
홈 폴더에 compose.d 폴더를 만들어 작업을 진행합니다.

mkdir ~/compose.d/{nginx,php,mariadb,build,htdocs} -p

.env

Docker compose에서 사용할 데이터베이스 설정을 관리합니다.
데이터베이스 설정은 사용자가 직접 지정해 주어야 합니다.

DB_ROOT_PASSWORD=default_root_password
DB_NAME=default
DB_USERNAME=default_username
DB_PASSWORD=default_password

compose.yaml

Nginx와 PHP, Mariadb 컨테이너에 필요한 설정이 모여 있습니다.

services:
  nginx:
    image: nginx:mainline-alpine
    depends_on:
      - php
      - mariadb
    networks:
      - backend
      - frontend
    ports:
      - "80:80"
    volumes:
      - ./htdocs/:/usr/share/nginx/html/
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    container_name: "web"

  php:
    build:
      context: "./build"
      dockerfile: "php"
    networks:
      - backend
    volumes:
      - ./htdocs/:/usr/share/nginx/html/
      - ./php/docker-php-upload.ini:/usr/local/etc/php/conf.d/docker-php-upload.ini
    container_name: "php"

  mariadb:
    build:
      context: "./build"
      dockerfile: "mariadb"
    restart: always
    volumes:
      - ./mariadb:/var/lib/mysql
    networks:
      - backend
    environment:
      MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
      MYSQL_DATABASE: "${DB_NAME}"
      MYSQL_USER: "${DB_USERNAME}"
      MYSQL_PASSWORD: "${DB_PASSWORD}"
    container_name: "db"

networks:
  - backend
  - frontend

nginx/default.conf

PHP 파일을 통해 Nginx로 들어올 때 PHP 컨테이너로 모든 요청을 보냅니다.

server {
    listen 80;
    server_name localhost;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    client_max_body_size 10M;
    
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        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;
    }

    location ~ /\.ht {
        deny all;
    }
}

php/docker-php-upload.ini

PHP에서 최대 업로드 가능한 파일의 크기를 설정합니다.

file_uploads = On
upload_max_filesize = 10M
post_max_size = 10M
max_execution_time = 6000

build/php

PHP에 필요한 설정입니다. PHP 컨테이너를 생성하면 자동으로 빌드합니다.

FROM php:8.3-fpm-alpine3.20

RUN apk add --no-cache --update \
    libjpeg-turbo-dev freetype-dev libpng-dev \
    libzip-dev icu-dev autoconf build-base \
    imagemagick imagemagick-dev \
    && docker-php-ext-configure intl \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) intl gd mysqli pdo_mysql zip exif

RUN pecl install imagick && \
    docker-php-ext-enable imagick

RUN sed -i -e 's/^www-data:x:[0-9]*:[0-9]*:/www-data:x:1000:1000:/' /etc/passwd && \
    sed -i -e 's/^www-data:x:[0-9]*:/www-data:x:1000:/' /etc/group

build/mariadb

Mariab에 필요한 설정입니다. Mariadb 컨테이너를 생성하면 자동으로 빌드합니다.

FROM mariadb:latest

RUN sed -i -e 's/^mysql:x:[0-9]*:[0-9]*:/mysql:x:1000:1000:/' /etc/passwd && \
    sed -i -e 's/^mysql:x:[0-9]*:/mysql:x:1000:/' /etc/group

Docker compose 실행하기

docker compose up -d

빌드한 이후 docker compose start, docker compose restart, docker compose stop 으로 제어할 수 있습니다.

관련 문서

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다