-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
♻️ refactor: Docker Compose: 개발 환경, 로컬 환경 작성 (6) #43
Draft
Jo-Minseok
wants to merge
73
commits into
main
Choose a base branch
from
refactor/docker-compose
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
…ctor/docker-compose
…ctor/docker-compose
…to refactor/docker-compose
…actor/docker-compose
…actor/docker-compose
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🔨 테스크
이전 PR 보러 가기
여기까지가 기존 CI/CD로 병합 가능 이후는 CI/CD PR 작성 후 처리
작업 사유
Docker 이미지를 구성함에 따라 애플리케이션들의 컨테이너를 하나 하나 생성하기에는 어려움이 존재하고, 어떤 환경(운영, 로컬, 개발)에서 어떤 Dockerfile을 사용해야 하는지 확인하기 어렵다.
도커의 러닝 커브가 심한 편이다 보니 최대한 사용자에게 추상화하여 제공하고자 작업을 수행했다.
추후 서비스 운영 비용의 한계로 인해 서비스를 종료했을 때 로컬에서 동작해볼 수 있도록 구현해야 포트폴리오로 의미있을 것이라 판단하여 작업을 수행했다.
현재는 프론트엔드 기능 개발 시 프로덕션(운영) 서버에 요청을 보내어 기능을 테스트한다.
![image](https://private-user-images.githubusercontent.com/99482796/410551566-69150b29-13c7-4153-84cc-f291c225652b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2Njk2MjUsIm5iZiI6MTczOTY2OTMyNSwicGF0aCI6Ii85OTQ4Mjc5Ni80MTA1NTE1NjYtNjkxNTBiMjktMTNjNy00MTUzLTg0Y2MtZjI5MWMyMjU2NTJiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE2VDAxMjg0NVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI4OTE1OGNiYTFjYmJlZTkxMzIwMDI4MzFlOGM0N2I2NDhmMzVmNDEwNzMzNjU3N2UzODk2YTcxNTcyNjNmYzgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.g-Bij6BtY74xOqHdtocyk2JgukaK23kOytW8IUXNXVo)
네이버 부스트 캠프 정규 시즌이 끝났기에 서비스 운영 입장에서 본다면, 프론트엔드 기능 테스트를 운영 서버에 직접 적용하면서 API 테스트를 하는 것은 올바르지 않다고 판단했다.
개발 서버를 따로 두기에는 인스턴스 비용이 2배로 증가하고, 유지 보수하는데 있어서 비용 소모가 클 것이라 판단했다.
프론트엔드 개발을 할 때, 로컬에 백엔드 서버가 켜져있다면, 로컬 서버를 이용할 경우 격리된 환경에서 기능 테스트가 가능할 것이고, DB 데이터도 본인이 직접 조작할 수 있기에 훨씬 안전할 수 있다.
로컬에서 백엔드 서버를 동작하기 위해서 프론트엔드 개발자 입장에서는 백엔드 서버 동작 방식을 이해해야 한다. 하지만, Docker Compose로 수행할 경우 추상화되기 때문에 필요가 없어진다.
백엔드 개발도 마찬가지로, 기존에 개발 방식은 로컬에 MySQL, Redis 서버를 Docker로 동작하여 인프라를 모방했었는데, 컨테이너를 만들때마다 DB 환경 변수를 입력해야 하고, Redis도 ACL 설정을 해야해서 번거로웠다. 또한 환경 변수도 백엔드 개발자마다 다르게 대입하는 문제가 있었어서 맞추기 어려웠다. 실제 환경과 개발 환경의 차이가 커서 제대로 동작하는 지 확인하기 어려웠다.
NGINX 배치해야 할까?
빌드 컨텍스트 외부 파일 포함 불가
Depends_on 옵션
Docker Compose에는 Depends_on 옵션이 있다. condition을 작성하지 않으면 단순 실행의 순서만 결정하기에 DB -> APP 순서로 단순 시작만 한다.
단순 시작만 하기에 DB가 완벽하게 준비 됐지 않았을 경우에 APP이 실행되는 문제가 있었다.
Docker Compose를 더 학습해보니 condition과 healthcheck를 사용하면 DB가 완벽하게(SQL문 초기화, DB 접속 가능 상태)가 되었을 때, APP을 시작하게 할 수 있었다.
이를 이용하여 Redis와 DB 초기화 시 APP을 구동하게 하여 표준 에러 출력을 전부 없앴다.
Docker Compose Watch 옵션
Docker Compose에 Watch 옵션을 사용하면 Hot Reload 방식을 모방할 수 있었다.
그래서 개발 환경 Docker Compose에는 프론트엔드 코드, 백엔드 코드를 Watch하게 하여 Vite와 NestJS의 Watch 문제를 해결하려 시도했지만, 파일 변경을 여전히 탐지하지 못 했다.
Polling 을 사용하기에는 CPU 사용량이 증가하기에 노트북 사용자들에게는 단점이 될 수 있어 해결하려 했다.
Vite 같은 경우 Volumes 디렉토리 경로를 프로젝트가 아닌 프로젝트 내 src로 설정해야 HMR 적용이 가능하다. 하지만, WSL 고질병 문제로 HostOS에서 바꿔도 적용이 안됨 -> 백엔드에서 이미 Polling을 사용하기에 프론트도 Vite Polling 사용하게 변경
NodeJS 같은 경우 Nodemon으로 reload를 탐지해서 HostOS에서 바꿔도 적용이 안 되기에 Polling을 사용
파일 변경을 탐지하고 강제로 실행 환경에 적용하려면 action을 rebuild로 진행하여 이미지를 아예 재빌드해야 한다.
코드 변경이 적용되기는 하지만 이미지 빌드 속도 + 컨테이너 실행 속도가 느리다 보니 반영되는데 너무 느렸다.
개발 생산성이 상당히 떨어질 것으로 판단했다.
Watch를 이용하여 NGINX의 설정 파일(nginx.conf)가 변경되었을 때, 컨테이너를 자동으로 rebuild되게 구현했다.
프론트엔드 프로젝트, 백엔드 프로젝트의 package.json에 의존성이 추가되면 자동으로 rebuild되게 구현했다.
개발 환경 컨테이너 내부 작업 vs 외부 작업 HostOS Volume 연결
개발 환경을 구축할 때 원래라면 컨테이너 내부에서 작업하고 Volume으로 백업해두는 방식을 사용한다고 봤다.
하지만, 개발 환경이 자주 바뀌는 (데스크탑 <-> 노트북) 경우에는 Volume을 이동하기에는 도커 러닝 커브가 존재한다.
단순 HostOS의 프로젝트 디렉토리만 다른 환경으로 가져가서 Compose를 동작하게 하면 개발 환경 변화에도 더 쉽게 대응할 수 있었다.
환경 설명
HostOS Volume 시 node_modules도 연동되는 문제 발생
TANSTACK 안 뜨는 문제
프론트 환경 변수로 NODE_ENV에 DEV를 입력했더니 TANSTAK이 안 뜨는 문제가 있었다. 프론트 환경 변수는 @jungmyunggi 님과 페어프로그래밍 중 필요없다는 것을 확인하여 제거했다.
📋 작업 내용
📷 스크린 샷(선택 사항)