도커로 워드프레스 스택 분리하기, 멀티사이트를 안 쓴 이유

메모리 여유를 확보하고 나서 실제로 두 번째 워드프레스를 올렸습니다. 이 글은 왜 워드프레스 멀티사이트를 쓰지 않고 스택을 통째로 분리했는지, 그리고 어떻게 했는지에 대한 이야기입니다.

멀티사이트로 묶을 수도 있었습니다

워드프레스에는 멀티사이트라는 기능이 있습니다. 설치 하나에 사이트를 여러 개 얹는 방식입니다. 관리 화면이 하나로 합쳐지니 편하고, 자원도 덜 씁니다.

그런데 이렇게 하면 두 블로그가 같은 데이터베이스, 같은 플러그인, 같은 PHP를 공유합니다. 한쪽에서 플러그인 충돌이 나면 다른 쪽도 같이 멈춥니다. 한쪽 트래픽이 몰리면 다른 쪽도 느려집니다.

이미 돌아가고 있는 블로그가 있는 상태에서, 새 블로그를 실험하다가 기존 블로그를 멈추게 하고 싶지 않았습니다. 그래서 스택을 통째로 나눴습니다.

멀티사이트 스택 분리
관리 지점 하나
메모리 적게 씀 더 씀 (스택당 250~450MB)
장애 영향 한쪽 문제가 양쪽에 서로 격리됨
실험 조심스러움 마음껏

메모리를 더 쓰는 건 감수했습니다. 앞 편에서 여유를 확보해둔 이유가 이것이었습니다.

포트가 겹치면 안 올라갑니다

컨테이너를 나눌 때 가장 먼저 부딪히는 게 포트입니다. 기존 워드프레스가 이미 어떤 포트를 쓰고 있으니, 새 것은 다른 번호를 줘야 합니다.

NAS에서 어떤 포트가 이미 쓰이고 있는지 확인하는 방법입니다.

cat /proc/net/tcp | awk 'NR>1 {print $2}' | cut -d: -f2   | sort -u | while read p; do printf '%d
' 0x$p; done | sort -n | uniq

DSM 자체도 여러 포트를 씁니다. 5000·5001은 관리 화면이고, 그 밖에도 패키지마다 쓰는 번호가 있습니다. 목록에 없는 번호를 골라야 안전합니다.

저는 기존 블로그가 8082를 쓰고 있어서 새 블로그에 8083을 줬습니다.

컴포즈 파일은 이렇게 나눴습니다

핵심은 서비스 이름, 네트워크, 데이터베이스를 전부 다르게 주는 것입니다. 이름이 겹치면 도커가 같은 것으로 취급하거나 충돌합니다.

services:
  myblog_db:
    image: mariadb:11
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - myblog_db_data:/var/lib/mysql
    networks:
      - myblog_net

  myblog:
    image: wordpress:php8.3-apache
    restart: unless-stopped
    depends_on:
      - myblog_db
    environment:
      WORDPRESS_DB_HOST: myblog_db
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - ./wp_data:/var/www/html
    ports:
      - "8083:80"
    networks:
      - myblog_net

networks:
  myblog_net:
    driver: bridge

volumes:
  myblog_db_data:

비밀번호는 파일에 직접 쓰지 않고 같은 폴더의 .env에 두고 불러옵니다.

여기서 워드프레스 파일과 데이터베이스를 다르게 취급한 것을 눈여겨봐 주십시오. 워드프레스는 폴더로 연결했고(./wp_data), 데이터베이스는 도커 볼륨(myblog_db_data)을 씁니다. 이유가 있는데, 그 얘기는 다음 편에서 하겠습니다. 여기서 제대로 막혔거든요.

빌드 전에 폴더를 만들어둬야 합니다

Container Manager에서 프로젝트를 만들고 빌드했더니 폴더가 없다는 오류가 났습니다.

컴포즈 파일이 ./wp_data를 연결하는데, 도커가 그 폴더를 알아서 만들어주지 않습니다. 미리 만들어두면 됩니다.

그리고 빌드가 끝난 직후 사이트에 들어가면 데이터베이스 오류가 뜰 수 있습니다. 이건 정상입니다. 데이터베이스가 처음 초기화되는 데 30초쯤 걸리기 때문입니다. 저는 이걸 모르고 원인을 찾아 헤맸습니다. 30초쯤 기다렸다 새로고침해 보시면 됩니다.

정리

  • 이미 돌아가는 블로그가 있다면 멀티사이트보다 스택 분리가 안전합니다. 메모리를 더 쓰는 대신 장애가 격리됩니다.
  • 포트는 미리 확인하고 안 쓰는 번호를 고르십시오. DSM도 여러 포트를 씁니다.
  • 서비스 이름·네트워크·데이터베이스 이름을 전부 다르게 주십시오.
  • 바인드마운트할 폴더는 빌드 전에 미리 만들어야 합니다.
  • 빌드 직후의 데이터베이스 오류는 초기화 중이라 그런 것일 수 있습니다. 30초 기다려 보십시오.

댓글 남기기