
제대로 배포를 해서 테스트해야겠다는 생각에, https로 배포를 하려 하였습니다.
원래 프론트엔드 코드는 배포해두지 않은 상태였고, 백엔드 코드만 docker와 docker-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_1과 frontend_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
컨테이너 재시작
docker-compose.yml을 수정한 후, Docker Compose를 재시작하여 변경 사항을 반영했습니다.
docker-compose down
docker-compose up --build
결과
인증서 파일을 frontend_1 컨테이너와 nginx_1 컨테이너 간에 공유한 후, frontend_1 컨테이너에서 발생한 인증서 관련 오류가 해결되었습니다.
Docker 환경에서 여러 컨테이너가 동일한 인증서 파일을 사용해야 할 경우, volumes를 활용하여 컨테이너 간 파일 공유가 필수적입니다.
인증서 파일을 올바르게 공유하고, Docker Compose 설정을 통해 이를 반영하면 이러한 문제를 해결할 수 있습니다.
(+ 하지만 이렇게 하면 문제가 발생합니다..... 다음글도 보셔야 합니다......)