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 인증서를 자동 발급 및 갱신

기존 구성

📁 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 발급기 역할