수동 설정에서 원-커맨드 배포까지: 워드프레스 Dockerizing 나의 여정

발행: (2025년 12월 26일 오후 05:11 GMT+9)
9 분 소요
원문: Dev.to

Source: Dev.to

위에 제공된 링크에 있는 전체 글을 번역하려면, 해당 글의 내용을 여기 복사해 주시겠어요?
코드 블록, URL, 마크다운 형식 등은 그대로 유지하면서 텍스트만 한국어로 번역해 드리겠습니다.

프로젝트 뒤의 “왜”

DevOps로 전환하고 있는 사람으로서, 실제 학습은 튜토리얼을 보는 것만으로는 이루어지지 않고 직접 구축하면서 이루어진다는 것을 금방 깨달았습니다. 이전에 수동 SSH 명령과 Ansible 플레이북을 사용해 WordPress를 설정한 경험이 있었지만, 컨테이너화가 DevOps의 기본 역량이라는 이야기를 계속 듣게 되었습니다. 그래서 30‑프로젝트 DevOps 로드맵 중 Project 1을 완수하기로 결심했습니다: 전체 WordPress LEMP 스택을 컨테이너화하는 작업입니다.

이 포스트에서는 제가 직접 진행한 과정, 마주한 도전 과제들, 그리고 그 과정에서 배운 핵심 개념들을 기록합니다.

내가 만든 것

단일 명령으로 실행할 수 있는 프로덕션 수준의 WordPress 환경을 만들었습니다:

docker-compose up -d

이 명령은 두 개의 컨테이너를 시작합니다:

  • MySQL 8.4 – 데이터베이스
  • WordPress (PHP 8.3) – 애플리케이션

전체 인프라스트럭처는 docker-compose.yml 파일에 정의되어 있습니다—실제로 구현된 인프라스트럭처 코드(Infrastructure as Code).

아키텍처: 간단하지만 강력함

User Browser → localhost:8080 → WordPress Container → MySQL Container (db:3306)

docker-compose.yml

services:
  db:
    image: mysql:8.4
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: ${DB_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DB_NAME: wordpress
    depends_on:
      - db
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:

주요 과제 및 해결책

과제 1 – 데이터베이스 연결 문제

  • 문제: WordPress 설치가 “database connection error” 오류로 실패했습니다.
  • 해결책: 컨테이너는 localhost가 아니라 서비스 이름을 통해 통신합니다. 데이터베이스 호스트를 db(서비스 이름)로 설정하면 문제가 해결되었습니다.

과제 2 – macOS에서 포트 충돌

  • 문제: 포트 80이 이미 사용 중이었습니다.
  • 해결책: compose 파일에서 포트 매핑을 "8080:80"으로 변경했습니다.

과제 3 – GitHub 인증 오류

  • 문제: 비밀번호 인증이 폐지되어 코드를 푸시할 수 없었습니다.
  • 해결책: GitHub 개인 액세스 토큰을 생성하고 CLI Git 작업에 사용했습니다.

What This Project Taught Me

  1. Infrastructure as Code (IaC) Isn’t Just a Buzzword
    전체 스택을 YAML 파일 하나에 정의하는 것이 혁명적으로 느껴졌습니다. 이 단일 파일은:

    • 버전 관리가 가능하고
    • 팀원과 공유할 수 있으며
    • 어디서든 동일한 환경을 배포할 수 있고
    • 문서 역할을 합니다
  2. Container Networking Is Magical (Once You Understand It)
    wordpress 컨테이너는 서비스 이름(db:3306)만 사용하면 db 컨테이너에 연결할 수 있습니다. Docker는 컨테이너가 이름으로 서로를 발견할 수 있는 가상 네트워크를 생성합니다.

  3. Development‑Production Parity Is Achievable
    동일한 환경이 다음에서 실행됩니다:

    • 내 로컬 MacBook
    • AWS EC2 인스턴스
    • CI/CD 파이프라인
    • 모든 개발자의 머신

    더 이상 “내 머신에서는 동작한다”는 문제가 없습니다!

  4. Learning in Public Has Benefits
    이 여정을 GitHub에 문서화하고 이 글을 작성하면서 이해도가 확고해졌습니다. complete code is available here 은 누구든지 참고하거나 확장할 수 있도록 제공됩니다.

비교: Docker 전후

항목수동/Ansible 설정Docker 적용 설정
설정 시간15–20 분30 초
재현성환경‑의존적일관성 보장
학습 곡선초기에는 낮음더 가파르지만 가치 있음
이식성서버‑특정Docker가 있는 어디서든 실행
스케일링수동 개입 필요컨테이너 추가

내가 따르는 필수 명령어

작업명령
모든 것을 시작docker-compose up -d
상태 확인docker-compose ps
로그 보기docker-compose logs -f
모든 것을 중지docker-compose down
볼륨까지 중지 및 삭제 (깨끗한 상태)docker-compose down -v
MySQL 쉘 접속docker-compose exec db mysql -u root -p

초보자를 위한: 내가 추천하는 학습 경로

  • 공식 Docker Getting Started 튜토리얼부터 시작하세요 – 자신감을 키워줍니다.
  • 간단한 것을 컨테이너화하세요 (예: 정적 웹사이트) 데이터베이스에 도전하기 전에.
  • Docker Compose를 일찍 사용하세요 – 멀티 컨테이너 앱을 간소화합니다.
  • docker-compose down -v를 두려워하지 마세요 – 새로 시작하면 문제를 해결하는 경우가 많습니다.
  • 오류 메시지를 꼼꼼히 읽으세요 – 보통 도움이 됩니다.

내 여정의 다음 단계

  • Nginx를 역방향 프록시로 추가하여 성능을 향상하고 SSL 종료를 구현합니다.
  • 업로드와 테마를 위해 persistent storage를 적절히 구현합니다.
  • Prometheus/Grafana 컨테이너를 사용해 monitoring을 추가합니다.
  • 이미지를 자동으로 빌드하고 배포하기 위한 CI/CD 파이프라인을 만듭니다.
  • 오케스트레이션을 배우기 위해 이를 Kubernetes manifests로 변환합니다.

최종 생각

Dockerizing WordPress는 벅찬 작업에서 역량을 강화시키는 기술로 바뀌었습니다. 네트워킹과 설정에 대한 초기 좌절감은 컨테이너의 힘을 깨달으면서 흥분으로 바뀌었습니다.

가장 귀중한 교훈은 Docker 자체가 아니라 DevOps 마인드셋이었습니다: 모든 것을 자동화하고, 철저히 문서화하며, 재현 가능한 시스템을 구축하라.

비슷한 학습 여정을 걷고 있는 여러분에게: 바로 구축을 시작하세요. 첫 번째 프로젝트는 완벽할 필요가 없으며, 완성될 필요가 있습니다. 그런 다음 그것에 대해 글을 쓰고, 공유하고, 다음 프로젝트를 시작하세요.

도움이 된 자료

연락처

Back to Blog

관련 글

더 보기 »