백엔드,프론트엔드 컨테이너 보완 옵션

EBAB!·2023년 7월 15일
0

Docker

목록 보기
11/15

백엔드

백엔드 컨테이너의 경우 로그관리와 컨테이너 상태, 의존성 파일이 저장되어야 합니다. 이를 위해 세 가지 볼륨을 추가해줍니다.(detached모드도 추가!)

docker run --name back -v my_backend_project_local_address:/app -v logs:/app/logs -v /app/node_modules --rm -d -p 80:80 --network test_net back_image
  • 로그 파일을 따로 보관하여 컨테이너가 소멸해도 데이터가 살아남도록 합니다. 물론 바인딩 마운트로 해도 되지만 데이터를 자주 조회하지 않는다는 가정으로 설정했습니다.
  • 그리고 백엔드 프로젝트 폴더인 /app 폴더 전체를 바인딩 마운트하여 상태를 공유합니다.
    • 여기서 볼륨 저장 방식을 다시 정리해보면, 볼륨은 컨테이너의 내부 경로가 자세할수록 우선순위를 가집니다(경로가 길수록). 로그 폴더를 우선적으로 저장하면서 전체 폴더를 덮어쓰기 떄문에 로그는 안전하게 우선 순위를 가집니다.
  • 마지막으로 의존성 데이터를 가진 /app/node_moules는 익명 볼륨으로 저장해줍니다. 익명 볼륨은 볼륨 종류중 가장 우선 순위가 높기 때문에 node_modules폴더는 따로 로컬호스트에 저장되지 않을 수 있습니다.

앞 게시글에선 DB의 통신 주소를 하드코딩 했습니다. 이를 동적으로 처리할 수 있도록 설정합니다.
우선 Dockerfile에다가 환경변수로 할당하는 것입니다.

# [Dockerfile]
.
.
ENV MONGODB_USERNAME=admin
ENV MONGODB_PASSWORD=secret
.

이후 백엔드에서 DB통신 url을 다음과 같이 바꿔줍니다.

// js 문법으로 작성한 예시입니다.
`mongodb://${process.env.MONGODB_USERNAME}:${MONGODB_PASSWORD}@db:27017/my_api`

마지막으로 제외할 파일들이 있다면 .dockerignore에 추가해주도록 합시다!



프론트엔드

프론트엔드는 코드의 수정이 시각적으로 바로 확인되는 것이 중요하기 때문에 라이브 소스 코드 업데이트가 필요합니다. 즉, 바인드 마운트가 필요하다는 의미가 됩니다.

react를 기준으로 할 때, 프로젝트 전체를 바인딩 마운트할 필요는 없고 그 안에서 페이지 코드가 담긴 src폴더를 바인딩 마운트를 해주면 됩니다.

docker run --name front -v my_src_dir_local_address:/app/src --rm -p 3000:3000 --network test_net -it front_image



image rebuilding

컨테이너를 생성할 때 마다npm install을 해주면 큰 용량의 의존성 파일들이 생성되고 바인딩 마운트를 해주면서 매번 로컬에 복사를 해주기 떄문입니다.

이를 해결하기 위해 .dockerignorenode_moules같은 폴더를 추가해주면 node_modules을 추가하지 않기 때문에 속도가 빨라집니다.

profile
공부!

0개의 댓글