🚀 배포할 프로젝트의 기술스택
🏁react
+node.js
(express) +mongoDB
풀스택 프로젝트🤔 EC2 + docker 로 배포 선정이유
⇒ ec2 터미널에서 프로젝트 환경을 설치-세팅해서 배포하기보단
docker 로 모든 환경을 구축해서 ec2 에서 가져오기만 하는 방식이 테스트하기도 좋고
AWS 과 docker 공식 문서에서 설명하는 비용절감과 편리한 코드전달 등의 이유로 docker를 사용해보기로 결정!
개발친구 구글링과 유투브 선생님들, 공식문서 참고해서 나름의 순서를 정리하고 시작했다.
docker + ec2 배포하기 단계
- dockerfile 로 이미지파일 생성 ⇒ 컨테이너로 실행해보고 테스트하기
- docker hub 에 이미지 올리기
- ec2 에 docker 설치 및 로그인
- ec2 에서 docker hub 에 있는 이미지를 pull 하여 컨테이너 실행하기
정리하면 쉽지만 과정은 순탄지 않았다ㅎㅎ…ㅎㅎ
빌드에 앞서 docker 설치
https://goddaehee.tistory.com/312 ⇒ 참고하여 설치, 터미널에 sudo -v 했을때 버전 정보가 뜬다면 잘 설치되어있는 것
dockerfile
, nginx.conf
파일 추가하기FROM nginx
# root 에 app 폴더를 생성
RUN mkdir /app
# work dir 고정
WORKDIR /app
# work dir 에 build 폴더 생성 /app/build
RUN mkdir ./build
# host pc의 현재경로의 build 폴더를 workdir 의 build 폴더로 복사
ADD ./build ./build
# nginx 의 default.conf 를 삭제
RUN rm /etc/nginx/conf.d/default.conf
# host pc 의 nginx.conf 를 아래 경로에 복사
COPY ./nginx.conf /etc/nginx/conf.d
# 80 포트 오픈
EXPOSE 80
# container 실행 시 자동으로 실행할 command. nginx 시작함
CMD ["nginx", "-g", "daemon off;"]
server {
listen 80;
location / {
root /app/build;
index index.html;
try_files $uri $uri/ /index.html;
}
}
dockerfile
파일 추가하기# 가져올 이미지를 정의
FROM node:16
# 경로 설정하기
WORKDIR /app
# package.json 워킹 디렉토리에 복사 (.은 설정한 워킹 디렉토리를 뜻함)
COPY package.json .
# 명령어 실행 (의존성 설치)
RUN npm install
# 현재 디렉토리의 모든 파일을 도커 컨테이너의 워킹 디렉토리에 복사한다.
COPY . .
# 각각의 명령어들은 한줄 한줄씩 캐싱되어 실행된다.
# package.json의 내용은 자주 바뀌진 않을 거지만
# 소스 코드는 자주 바뀌는데
# npm install과 COPY . . 를 동시에 수행하면
# 소스 코드가 조금 달라질때도 항상 npm install을 수행해서 리소스가 낭비된다.
# 3030번 포트 노출
EXPOSE 3030:3306
# npm start 스크립트 실행
CMD ["npm", "start"]
# 클라이언트단 빌드
sudo docker build -t 이미지이름 .
sudo docker run -d --name 컨테이너이름 -p 8300:80 이미지이름
# run : 실행
# -d : 백그라운드 모드
# -p 8300:80 : 포트 연결 외부노출포트:내부포트
# 컨테이너에서 사용할 이미지 이름은 위의 명령어에서 만들어준 이미지 이름과 동일해야한다.
sudo docker ps
명령어로 현재 실행중인 컨테이너 목록을 확인할 수 있음localhost://8300
으로 들어가서 잘뜬다면 성공sudo docker tag nginx-react zeeyoon/nginx-react:latest
# 연결하기! 생성해둔이미지이름 레파지토리에올릴이름:버전
sudo docker push zeeyoon/nginx-react:latest
# push 하기
docker hub 에 올라와있는 것을 확인할 수 있음
프리티어로 인스턴스를 생성해준다.
키 페어를 생성해주고 권한 설정 해주기
mv ~/Downloads/키페어파일 ~/.ssh/키페어파일
chmod 400 ~/.ssh/키페어파일
ssh -i 생선한키파일.pem 사용자이름@발급받은퍼블릭ip주소
sudo yum install docker -y
# 설치해주기
sudo docker login
# 로그인해주기
sudo service docker start
# docker 시작하기
sudo docker pull zeeyoon/nginx-react:latest
# 도커가 로그인 되어있다는 가정하에!
# 내가 만든 레파지토리를 Pull 해오기
sudo docker run -d --name my-react-app -p 8300:80 zeeyoon/nginx-react:latest
# 가져온 이미지를 컨테이너를 만들면서 실행시킨다.
# 서버단 이미지도 똑같이 pull 받고 실행해준다.
sudo docker run -t -i -p 3040:3307 zeeyoon/tdz-node
프론트엔드 개발자 취업을 하는데 내 프로젝트를 눈으로 확인할 배포사이트 하나 없는게 계속 마음에 걸려 그냥 내가 배포해버리자..^^..! 라는 가벼운 마음으로 시작했지만 역시 어려웠다.
(AWS 도 제대로 모르는데 docker 까지 하려니중간에 다놔버리고 싶었지만ㅎㅎ어찌저찌 배포했다.)
다하고 보니 사람들이 왜 배포자동화 ci/cd 에 대해 이야기하는지 필요성을 알게되었다.
코드 바뀔때마다 이 과정들을 다시 반복하는것은 너무 비효율적인것 같고 추가적으로 공부해서 적용해봐야겠다🤔
🚩참고한 자료