Lightsail에 Docker로 워드프레스 구축하기 — 전체 과정 정리
AWS Lightsail은 저렴한 고정 요금으로 가상 서버를 운영할 수 있어 개인 프로젝트나 소규모 서비스에 자주 쓰입니다. 여기에 Docker를 올려 워드프레스를 구성하면 환경 격리, 배포 일관성, 업그레이드 편의성 측면에서 여러 이점을 얻을 수 있습니다. 이 글은 Lightsail 인스턴스를 생성하는 시점부터 워드프레스가 HTTPS로 접속 가능한 상태까지의 전체 과정을 실제 작업 순서에 맞게 정리한 것입니다.
Lightsail 인스턴스 생성
AWS 콘솔에서 Lightsail 서비스로 이동한 뒤 새 인스턴스를 생성합니다. 플랫폼은 Linux/Unix, 블루프린트는 OS Only → Ubuntu 22.04 LTS를 선택합니다. 워드프레스 블루프린트를 선택하는 방식도 있지만, Docker로 직접 구성할 것이므로 순수 OS 이미지를 사용하는 것이 적합합니다.
인스턴스 플랜은 메모리 1GB 이상을 권장합니다. 512MB 플랜도 동작은 하지만, MySQL 컨테이너와 워드프레스 컨테이너가 동시에 올라가면 메모리가 빠듯해져 재시작이 잦아질 수 있습니다. 월 $5 플랜(1GB RAM)부터 안정적으로 운영할 수 있습니다.
인스턴스 이름을 지정하고 생성을 완료한 뒤, **고정 IP(Static IP)**를 반드시 할당합니다. Lightsail 인스턴스는 재시작하면 공인 IP가 바뀌기 때문에 고정 IP 없이는 도메인 연결이 불안정해집니다. 고정 IP는 인스턴스에 연결된 상태에서는 추가 비용이 없습니다.
방화벽 포트 설정
인스턴스 상세 페이지의 네트워킹 탭에서 방화벽 규칙을 추가합니다. 기본적으로 SSH(22번)는 열려 있으며, 다음 포트를 추가로 허용합니다.
- 80 (HTTP) — Let’s Encrypt 인증 및 HTTP 리디렉션용
- 443 (HTTPS) — 실제 서비스 접속용
나중에 Nginx를 리버스 프록시로 사용하면 워드프레스 컨테이너 포트를 외부에 직접 노출하지 않아도 됩니다. 보안 측면에서 컨테이너 포트(예: 8080)를 방화벽에서 열지 않는 것이 좋습니다.
서버 초기 설정 및 Docker 설치
SSH로 인스턴스에 접속한 뒤 시스템 패키지를 최신 상태로 업데이트합니다.
sudo apt update && sudo apt upgrade -y
이후 Docker 공식 문서에서 안내하는 방식으로 Docker Engine을 설치합니다. Ubuntu 22.04 기준으로는 apt 저장소를 추가하는 방법을 사용합니다.
# 필수 패키지 설치
sudo apt install -y ca-certificates curl gnupg
# Docker GPG 키 추가
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 저장소 추가
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker 설치
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Docker Compose는 위 명령에서 docker-compose-plugin으로 함께 설치됩니다. 설치 후 docker compose version 명령으로 정상 설치 여부를 확인합니다.
현재 사용자를 docker 그룹에 추가해두면 매번 sudo를 붙이지 않아도 됩니다.
sudo usermod -aG docker $USER
newgrp docker
Docker Compose 파일 작성
작업 디렉터리를 만들고 docker-compose.yml 파일을 작성합니다.
mkdir ~/wordpress && cd ~/wordpress
nano docker-compose.yml
아래는 기본 구성 예시입니다.
services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: 강력한_루트_비밀번호
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: 강력한_사용자_비밀번호
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
restart: always
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: 강력한_사용자_비밀번호
volumes:
- wp_data:/var/www/html
volumes:
db_data:
wp_data:
이 구성에서 워드프레스 컨테이너는 외부 포트를 노출하지 않습니다. Nginx가 리버스 프록시로 앞단에서 요청을 받아 내부 컨테이너로 전달할 것이기 때문입니다. MySQL 비밀번호는 추측하기 어려운 값으로 반드시 변경해야 합니다.
Nginx 리버스 프록시 설정
호스트 서버에 Nginx를 직접 설치하고 리버스 프록시로 구성합니다. 컨테이너 내부 포트와 호스트 네트워크를 연결하기 위해 docker-compose.yml에서 워드프레스 컨테이너의 포트를 127.0.0.1에만 바인딩합니다.
docker-compose.yml의 wordpress 서비스에 아래 항목을 추가합니다.
ports:
- "127.0.0.1:8080:80"
Nginx를 설치합니다.
sudo apt install -y nginx
/etc/nginx/sites-available/wordpress 파일을 생성합니다.
server {
listen 80;
server_name 예시도메인.com www.예시도메인.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
설정을 활성화하고 Nginx를 재시작합니다.
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Let’s Encrypt로 HTTPS 적용
Certbot을 사용해 SSL 인증서를 발급합니다. 이 단계 이전에 도메인의 DNS A 레코드가 Lightsail 고정 IP를 가리키고 있어야 합니다.
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d 예시도메인.com -d www.예시도메인.com
Certbot이 Nginx 설정을 자동으로 수정해 HTTPS 블록을 추가하고 HTTP를 HTTPS로 리디렉션하는 설정까지 처리해 줍니다. 인증서 자동 갱신은 systemctl status certbot.timer로 확인할 수 있으며, 기본적으로 활성화되어 있습니다.
컨테이너 실행 및 워드프레스 초기 설정
컨테이너를 백그라운드로 실행합니다.
cd ~/wordpress
docker compose up -d
docker compose ps 명령으로 db와 wordpress 컨테이너가 모두 running 상태인지 확인합니다. 처음 실행 시 이미지 다운로드와 MySQL 초기화에 시간이 걸릴 수 있으므로, 잠시 기다린 뒤 접속을 시도하는 것이 좋습니다.
브라우저에서 https://예시도메인.com에 접속하면 워드프레스 설치 화면이 나타납니다. 언어 선택 후 사이트 제목, 관리자 계정 정보를 입력하면 설치가 완료됩니다.
리버스 프록시 환경에서 URL 문제 해결
Nginx 리버스 프록시를 통해 HTTPS로 접속하는 경우, 워드프레스가 내부적으로 HTTP URL을 사용해 리소스를 불러오거나 리디렉션 루프가 발생하는 경우가 있습니다. 이를 방지하려면 워드프레스 컨테이너에 다음 환경 변수를 추가합니다.
environment:
WORDPRESS_CONFIG_EXTRA: |
define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
$_SERVER['HTTPS'] = 'on';
}
또는 wp-config.php에 동일한 내용을 직접 추가할 수도 있습니다. 이 설정은 Nginx가 전달하는 X-Forwarded-Proto 헤더를 워드프레스가 인식하도록 해 HTTPS 환경에서 올바르게 동작하게 합니다.
데이터 백업 방법
Docker 볼륨에 저장된 데이터를 정기적으로 백업하는 것이 중요합니다. 가장 간단한 방법은 mysqldump를 컨테이너 내부에서 실행하는 것입니다.
docker compose exec db mysqldump -u wpuser -p강력한_사용자_비밀번호 wordpress > backup.sql
워드프레스 파일(업로드 이미지, 테마, 플러그인 등)은 wp_data 볼륨에 저장됩니다. 볼륨의 실제 경로는 docker volume inspect wordpress_wp_data 명령으로 확인할 수 있으며, 해당 경로를 압축해 Lightsail의 스냅샷이나 외부 스토리지로 보내두면 됩니다.
Lightsail 자체의 인스턴스 스냅샷 기능을 활용하는 것도 좋은 방법입니다. 다만 스냅샷은 수동 또는 자동으로 생성할 수 있으며, 스냅샷 보관 수에 따라 비용이 발생합니다.
운영 중 자주 쓰는 명령
구축 후 실제 운영 단계에서 자주 사용하게 되는 명령을 정리합니다.
| 목적 | 명령 |
|---|---|
| 컨테이너 상태 확인 | docker compose ps |
| 로그 확인 | docker compose logs -f wordpress |
| 컨테이너 재시작 | docker compose restart |
| 이미지 업데이트 후 재시작 | docker compose pull && docker compose up -d |
| 컨테이너 중지 | docker compose down |
워드프레스 이미지 업데이트는 docker compose pull 후 docker compose up -d를 실행하면 됩니다. 볼륨 데이터는 유지되므로 콘텐츠 손실 없이 이미지만 교체됩니다. 단, 메이저 버전 업그레이드 전에는 반드시 백업을 먼저 진행하는 것이 안전합니다.
이 구성은 개인 블로그나 소규모 사이트 운영에 충분한 수준이며, 트래픽이 늘어날 경우 Lightsail 플랜 업그레이드나 오브젝트 스토리지 연동 등으로 확장할 수 있습니다.