Technote

서버 · 인프라 실무

워드프레스 Docker 스택 구성 — nginx · PHP-FPM · MariaDB · Redis

서비스 네 개를 컨테이너로 가르는 이유는 유행이 아니라 재현성입니다. 다음 서버에서도, 사고 후 복구에서도, 같은 파일이 같은 스택을 다시 세웁니다.

워드프레스 호스팅 사고의 상당수는 “그 서버에만 있던 설정” 에서 나옵니다. PHP 버전, 확장 모듈, nginx 규칙이 서버에 손으로 쌓여 있으면 이전도 복구도 고고학이 됩니다. compose 파일 하나로 스택을 선언하면 서버가 아니라 파일이 진실이 됩니다.

서비스 넷 — 역할이 겹치지 않는다

최소 골격

services:
  nginx:
    image: nginx:alpine
    ports: ['80:80', '443:443']
    volumes:
      - ./wordpress:/var/www/html
      - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
  php:
    build: ./docker          # php-fpm + 필요한 확장 + wp-cli
    volumes:
      - ./wordpress:/var/www/html
  db:
    image: mariadb:11
    environment:
      MARIADB_DATABASE: wordpress
    volumes:
      - db-data:/var/lib/mysql
  redis:
    image: redis:7-alpine
volumes:
  db-data:

결정의 이유들

  • DB_HOST 는 서비스명 — define('DB_HOST', 'db'). IP 를 적는 순간 파일의 재현성이 깨집니다.
  • utf8mb4 고정 — 구형 utf8 은 3바이트라 이모지 · 일부 한자가 무음 손실됩니다. 새 스택에서 이걸 물려받을 이유가 없습니다.
  • Redis 는 오브젝트 캐시만 — 페이지 캐시까지 맡기면 nginx 캐시와 무효화 타이밍이 어긋나 “관리자에겐 새 페이지, 방문자에겐 옛 페이지” 가 됩니다.
  • 코드는 읽기 전용 마운트가 이상적 — 쓰기가 필요한 곳은 uploads 뿐입니다. 침해 시 변조 범위가 그만큼 줄어듭니다.

스택이 선 다음

docker compose up -d
docker compose exec php wp core version   # WP-CLI 가 컨테이너 안에서 동작하는가
docker compose exec php wp redis status   # Drop-in: Valid 확인

페이지 캐시 계층의 규칙은 FastCGI 캐시 우회 규칙에서 이어집니다. 이 스택 구성 — Docker 미설치 서버의 설치부터 — 이 최적화 지원 사업의 배포 항목입니다.

이 주제의 다른 글

노하우 목록으로

서버 · 인프라 심화

wp-cron 을 시스템 크론으로 옮기기 — 예약이 늦는 이유

예약한 글이 정시에 안 나오는 이유는 대개 코드가 아니라 구조입니다. 워드프레스의 크론은 방문 요청에 얹혀 돌기 때문에, 조용한 사이트에서는 아무것도 실행되지 않습니다.

개발자 4분 읽기

서버 · 인프라 실무

페이지 캐시는 서버 계층에 둡니다

완성된 HTML 을 보관하는 계층은 PHP 앞에 있어야 값을 합니다. 서버 캐시 위에 플러그인 캐시를 얹으면 무효화 타임라인이 둘이 됩니다.

개발자 4분 읽기

₩270,000 · 신청하기