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

Docker compose 설치

Debian에서 Docker compose를 설치하는 방법입니다.
Docker 설치하기 링크로 이동하시면 더욱 자세한 가이드가 있습니다.

Bash
sudo apt install docker-compose-plugin

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

Bash
mkdir ~/compose/{apache,php,mariadb,database,htdocs} -p

.env

Docker compose에서 사용할 버전과 이름, 데이터베이스 설정을 관리합니다.
개발을 위해 특정 버전을 사용해야 하는 경우 버전을 변경할 수 있습니다.

데이터베이스 설정은 사용자가 직접 지정해 주어야 합니다.

.env
APACHE_VERSION=2.4
PHP_VERSION=8.2
MARIADB_VERSION=latest

NET_BACKEND=backend
NET_FRONTEND=frontend

DB_ROOT_PASSWORD=(DB에 사용할 ROOT 비밀번호)
DB_NAME=(자료를 저장할 DB 이름)
DB_USERNAME=(DB 로그인에 사용할 아이디)
DB_PASSWORD=(DB 로그인에 사용할 비밀번호)

compose.yaml

Apache2와 PHP, Mariadb 컨테이너에 필요한 설정이 모여 있습니다. 이곳에서 참조할 디렉토리 또는 포트 번호를 필요에 따라 다른 값으로 변경 가능합니다.

compose.yaml
services:
  apache:
    build:
      context: './apache/'
      args:
        APACHE_VERSION: ${APACHE_VERSION}
    depends_on:
      - php
      - mariadb
    networks:
      backend:
      frontend:
    ports:
      - "80:80"
    volumes:
      - ./htdocs/:/var/www/html/
      - ./apache/apache.conf:/usr/local/apache2/conf/apache.conf
    container_name: "web"

  php:
    build:
      context: './php/'
      args:
        PHP_VERSION: ${PHP_VERSION}
    networks:
      backend:
    volumes:
      - ./htdocs/:/var/www/html/
    container_name: "php"

  mariadb:
    build:
      context: './mariadb/'
      args:
        MARIADB_VERSION: ${MARIADB_VERSION}
    restart: always
    ports:
      - "3306:3306"
    volumes:
      - ./database:/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:

apache/apache.conf

PHP파일이 Apache2로 들어올 때 PHP 컨테이너의 php-fpm으로 모든 요청을 보냅니다.

apache.conf
ServerName localhost

LoadModule deflate_module modules/mod_deflate.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule rewrite_module modules/mod_rewrite.so

<VirtualHost *:80>
  ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1

  DocumentRoot /var/www/html/

  <Directory /var/www/html/>
    DirectoryIndex index.php
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>

  CustomLog /proc/self/fd/1 common
  ErrorLog /proc/self/fd/2
</VirtualHost>

apache/Dockerfile

Dockerfile
ARG APACHE_VERSION=""
FROM httpd:${APACHE_VERSION}-alpine

RUN echo "Include /usr/local/apache2/conf/apache.conf" \
    >> /usr/local/apache2/conf/httpd.conf

php/Dockerfile

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

Dockerfile
ARG PHP_VERSION=""
FROM php:${PHP_VERSION:+${PHP_VERSION}-}fpm-alpine

RUN apk update; apk upgrade; \
    apk add --no-cache libtool autoconf \
    g++ make libmcrypt-dev libpng-dev \
    freetype-dev libxpm-dev libwebp-dev \
    libwebp libjpeg-turbo libpng freetype \
    libxml2-dev curl-dev icu-dev icu-libs \
    libzip shadow imagemagick imagemagick-libs \
    imagemagick-dev libgcc libstdc++ libzip-dev \
    libjpeg-turbo-dev libjpeg-turbo-utils \
    linux-headers

RUN pecl install imagick xdebug &&
    docker-php-ext-enable imagick.so xdebug.so &&
    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 &&
    usermod -u 1000 www-data &&
    groupmod -g 1000 www-data

mariadb/Dockerfile

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

Dockerfile
ARG MARIADB_VERSION=""
FROM mariadb:${MARIADB_VERSION}

RUN usermod -u 1000 mysql &&
    groupmod -g 1000 mysql

Docker compose 실행하기

Bash
docker compose up -d

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

관련 문서

답글 남기기

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