Skip to main content

#1. 도커 컨테이너 기반 프로젝트에서 자동 SSL 발급 받는 법

⚠️ 문제

Docker 기반으로 AWS Lightsail에서 운영 중인 프로젝트에서,
HTTPS 접속 시 **브라우저에 '보안 경고'**가 표시되는 문제

🔍 원인 분석

서버에 유효한 SSL 인증서가 설정되어 있지 않기 때문이다.
HTTPS를 사용할 경우, 신뢰된 인증 기관(CA)에서 발급한 인증서가 필요하며,
없을 경우 브라우저는 연결을 '안전하지 않음'으로 간주한다.

⚡ 해결 방법

Docker 환경에서 자동으로 SSL 인증서를 발급 및 갱신하도록 설정하기 위해
아래 두 개의 Docker 이미지를 기존 docker-compose.yml에 추가해서 해결했다.

🔧 사용 이미지

  1. Nginx Reverse Proxy
    jwilder/nginx-proxy:
    여러 컨테이너에 대한 요청을 자동으로 프록시해주는 리버스 프록시 서버
  2. Let's Encrypt Companion
    jrcs/letsencrypt-nginx-proxy-companion:
    위의 nginx-proxy와 연동되어, Let's Encrypt를 통해 SSL 인증서를 자동 발급 및 갱신
⚠️ 문제
  • (Docker 기반으로 AWS Lightsail에서 운영하는 프로젝트)
  • HTTPS로 접속시 브라우저에서 '보안 경고'가 발생하는 문제


🔍 원인 분석
  • SSL 인증서 없음


⚡ 해결방법
  • 기존 docker-compose.yml 파일에 아래 2가지 Docker 이미지를 추가하여 SSL 자동 발급
    Nginx reverse proxy (jwilder/nginx-proxy),
    Let's Encrypt companion (JrCs/letsencrypt-nginx-proxy-companion)

기존 구성

📁 DainWiki/
├── 📁 bookstack/
├── 📁 bookstack_db/
├── docker-compose.yml

yml 파일 수정 후

📁 DainWiki/
├── 📁 bookstack/         # BookStack 컨테이너 설정 및 데이터
├── 📁 bookstack_db/      # MariaDB 데이터
├── 📁 certs/             # 인증서 저장소 (자동 생성됨)
├── 📁 html/              # nginx 기본 페이지 저장소
├── 📁 vhost.d/           # 가상 호스트 설정 (자동 생성됨)
├── docker-compose.yml   # 전체 도커 설정

image.png

📌 ① Let's Encrypt 인증서 발급용 설정

service:
- VIRTUAL_HOST=dainwiki.com
- LETSENCRYPT_HOST=dainwiki.com
- LETSENCRYPT_EMAIL=your@email.com

📌 ② APP_URL 값 http → https로 변경함

-      - APP_URL=http://dainwiki.com
+      - APP_URL=https://dainwiki.com

→ 프로젝트가 내부적으로 https 주소를 인식하게 해준다.

📌 ③ nginx-proxy 및 letsencrypt 컨테이너 추가

nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs
      - ./vhost.d:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
    networks:
      - bookstack_net

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt
    restart: always
    environment:
      - NGINX_PROXY_CONTAINER=nginx-proxy
      - DEFAULT_EMAIL=your@email.com
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs:/etc/nginx/certs
      - ./vhost.d:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
    depends_on:
      - nginx-proxy
    networks:
      - bookstack_net

→ 자동 프록시 + SSL 발급기 역할