정리/가상화
Docker Compose Caddy 로 Let's Encrypt 인증서 처리
워로디스
2026. 4. 9. 22:40
Docker Compose 로 띄운 Caddy 를 통해 다수 도메인을 Let's Encrypt 적용하고, 각 도메인에 대한 요청이 호스트상의 특정 포트로 연결되도록 하는 구성입니다.
0. 사전 준비 (DNS 설정)
Caddy 컨테이너를 실행하기 전에, 도메인 등록 업체(가비아, AWS Route53 등)에서 아래 두 도메인의 A 레코드가 서버의 공인 IP를 향하도록 설정되어 있어야 합니다.
a.com➔ 서버 IPb.com➔ 서버 IP
1. 작업 디렉토리 및 파일 생성
서버에 접속하여 Caddy 설정을 모아둘 폴더를 만들고 이동합니다.
mkdir caddy-proxy
cd caddy-proxy
touch Caddyfile compose.yaml2. Caddyfile 작성
Caddy의 라우팅 규칙입니다. host.docker.internal을 사용하여 컨테이너 밖의 호스트(서버 본체) 포트로 트래픽을 안전하게 넘깁니다.
# Caddyfile
a.com {
reverse_proxy host.docker.internal:8081
}
b.com {
reverse_proxy host.docker.internal:8082
}3. compose.yaml 작성
Caddy를 실행하기 위한 설정입니다. 인증서 유지를 위한 볼륨 마운트와 HTTP/3 통신을 위한 UDP 포트 개방이 모두 포함되어 있습니다.
# compose.yaml
services:
caddy:
image: caddy:latest
container_name: caddy-proxy
restart: unless-stopped
ports:
- "80:80" # HTTP (Caddy가 HTTPS로 자동 리다이렉트)
- "443:443" # HTTPS (TCP - HTTP/1.1, HTTP/2 용)
- "443:443/udp" # HTTPS (UDP - HTTP/3 QUIC 지원용)
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro # Caddy 설정 파일 (읽기 전용)
- caddy_data:/data # 인증서 저장 (매우 중요, 유실 방지)
- caddy_config:/config # Caddy 내부 상태 저장
extra_hosts:
- "host.docker.internal:host-gateway" # 컨테이너 ➔ 호스트 네트워크 접근 허용
volumes:
caddy_data:
caddy_config:4. 실행 명령어
작업 디렉토리(caddy-proxy) 안에서 아래 명령어를 실행하여 컨테이너를 백그라운드로 띄웁니다.
# Docker 사용 시
sudo docker compose up -d
# Podman 사용 시
sudo podman compose up -d5. 동작 상태 확인
Caddy가 정상적으로 실행되고 Let's Encrypt로부터 인증서를 잘 받아왔는지 로그를 통해 확인합니다.
# 로그 실시간 확인 (빠져나오려면 Ctrl + C)
sudo docker logs -f caddy-proxy(로그 중에 certificate obtained successfully라는 메시지가 보이면 완벽하게 성공한 것입니다.)
6. 추가사항
- 현재 8081, 8082 포트의 앱이 켜져 있지 않더라도
compose up -d를 하는 순간 인증서는 자동으로 발급되고 갱신 주기에 맞춰 알아서 연장됩니다. - 추후 라우팅 규칙(도메인이나 포트)을 변경하고 싶다면
Caddyfile만 수정한 뒤,sudo docker exec caddy-proxy caddy reload --config /etc/caddy/Caddyfile명령어를 치면 컨테이너 재시작 없이(Zero-downtime) 설정만 즉시 갱신할 수 있습니다.