워로디스

Docker Compose Caddy 로 Let's Encrypt 인증서 처리 본문

정리/가상화

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 ➔ 서버 IP
  • b.com ➔ 서버 IP

1. 작업 디렉토리 및 파일 생성

서버에 접속하여 Caddy 설정을 모아둘 폴더를 만들고 이동합니다.

mkdir caddy-proxy
cd caddy-proxy
touch Caddyfile compose.yaml

2. 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 -d

5. 동작 상태 확인

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) 설정만 즉시 갱신할 수 있습니다.