Docker Compose와 Nginx를 활용한 HTTPS 배포 오류 해결기

정혜인·2024년 11월 21일

클라우드

목록 보기
7/15

제대로 배포를 해서 테스트해야겠다는 생각에, https로 배포를 하려 하였습니다.

원래 프론트엔드 코드는 배포해두지 않은 상태였고, 백엔드 코드만 dockerdocker-compose를 이용하여 배포해둔 상황이었습니다. (docker-compose를 미리 썼던 이유는, 프론트 코드와 백엔드 코드를 빠르게 바로 배포하기 위함)

이미 root 폴더에 docker-compose.yml 파일과 nginx.conf 파일을 생성해두었기 때문에, 프론트엔드 폴더에 Dockerfile을 생성해준 뒤 연결만 시켜주면 빠르게 배포할 수 있을 것이라 생각하였습니다.

하지만 단순한 배포가 아닌 https로의 배포라 인증서를 적용하는 데에 많은 어려움을 겪었고, 시간을… 정말 많이 소모하였습니다….

🛠️ 문제 상황

Docker 환경에서 Nginx와 프론트엔드 컨테이너를 설정하고, Let's Encrypt SSL 인증서를 사용하여 HTTPS를 설정하던 중, frontend_1 컨테이너에서 다음과 같은 오류가 발생했습니다:

cannot load certificate "/etc/letsencrypt/live/ddara.kro.kr/fullchain.pem": BIO_new_fle() failed (SS:: error:system library:: No such file or directory)

이 오류는 frontend_1 컨테이너가 /etc/letsencrypt/live/ddara.kro.kr/fullchain.pem 경로에서 SSL 인증서 파일을 찾을 수 없어서 발생한 문제입니다.

그런데 아무리 확인해봐도 해당 파일이 정확한 위치에 잘 존재하고 있었고,

혹시 권한 문제인가 싶어 chmod 명령어로 권한 설정도 해주었고,

etc/letsencrypt/archive/ddara.kro.kr~ 로 포팅이 되고 있었는데, 이 과정에서 경로 참조에 문제가 생긴건가 싶어 다른 경로로 복사해보거나, 경로를 바꾸어보거나.. 등등 다 해보았지만 해결할 수 없었습니다.

🤔 발견한 문제 원인

문제의 원인은 nginx_1 컨테이너와 frontend_1 컨테이너 간 인증서 파일 경로를 공유하지 않았기 때문입니다. 기본적으로, 인증서 파일은 nginx_1 컨테이너 내에 존재하고 있지만, frontend_1 컨테이너에서는 이를 참조할 수 없었습니다.

가장 의아했던 부분이, nginx 컨테이너에서는 오류가 발생하지 않는데 frontend 컨테이너에서만 인증서에 접근할 수 없다는 오류가 발생한다는 점이었습니다.

이 점에 집중해서 알게된 것이, nginx 컨테이너는 인증서를 위 경로에 가지고 있지만, 다른 컨테이너에서는 접근할 수 없기 때문이라는 점이었습니다.

✅ 해결 방법

Docker Compose에서 volumes를 사용하여 인증서 파일을 nginx_1frontend_1 컨테이너 간에 공유하는 방식으로 문제를 해결했습니다. 이를 통해 두 컨테이너가 동일한 인증서 파일에 접근할 수 있게 되었습니다.

  1. docker-compose.yml 수정

    frontend_1 컨테이너에도 인증서 파일을 공유하도록 volumes 설정을 추가해주었습니다.

    version: '2'
    services:
      backend:
        build:
          context: .
          dockerfile: backend/Dockerfile
        ports:
          - "3001:3001"
        environment:
          - NODE_ENV=production
        networks:
          - app-network
    
      nginx:
        image: nginx:alpine
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf
          - /etc/letsencrypt:/etc/letsencrypt  # 인증서 파일을 nginx와 공유
        ports:
          - "80:80"
          - "443:443"
        networks:
          - app-network
        depends_on:
          - backend
    
      frontend:
        build:
          context: ./frontend
          dockerfile: Dockerfile  # frontend의 Dockerfile
        volumes:
          - /etc/letsencrypt:/etc/letsencrypt  # 인증서 파일을 frontend와 공유
        ports:
          - "80:80"
        networks:
          - app-network
        depends_on:
          - nginx
    
    networks:
      app-network:
        driver: bridge
  2. 컨테이너 재시작

    docker-compose.yml을 수정한 후, Docker Compose를 재시작하여 변경 사항을 반영했습니다.

    docker-compose down
    docker-compose up --build
  3. 결과

    인증서 파일을 frontend_1 컨테이너와 nginx_1 컨테이너 간에 공유한 후, frontend_1 컨테이너에서 발생한 인증서 관련 오류가 해결되었습니다.

🎉 결론

Docker 환경에서 여러 컨테이너가 동일한 인증서 파일을 사용해야 할 경우, volumes를 활용하여 컨테이너 간 파일 공유가 필수적입니다.

인증서 파일을 올바르게 공유하고, Docker Compose 설정을 통해 이를 반영하면 이러한 문제를 해결할 수 있습니다.

(+ 하지만 이렇게 하면 문제가 발생합니다..... 다음글도 보셔야 합니다......)

0개의 댓글