node.js 프로젝트, Docker,EC2 배포

Kyoungchan Cho·2023년 1월 3일
0

Docker

목록 보기
5/5
post-thumbnail

intro

나이키 웹사이트를 모티브로 한 프로젝트[Link]를 도커를 활용하여 EC2 인스턴스로 배포하는 기록
EC2는 ubuntu20.04로, RDS는 미리 만들어둔 상태로 진행한다.
혹시 모를 상황에 대비해 jupyter-notebook을 EC2 인스턴스에 설치하고 시작한다.


1. 프로젝트 Dockerfile 작성

프로젝트 루트폴더에 Dockerfile.dockerignore를 작성한다.

추후 프로세스를 모니터링하고 EC2 터미널에서 조작을 용이하기 위해 PM2 패키지를 활용해보자.
도커 컨테이너에서 pm2 start app.js 로 구동할 경우 컨테이너가 바로 꺼지기 때문에
CMD ["pm2-runtime","app.js"]" 로 작성한다.
node:16-alpine으로 진행하다가 이미지 빌드시 에러가 발생해서 그냥 node:16.4.2로 변경

#Dockerfile

FROM node:16.4.2
WORKDIR /usr/src/app
COPY package*.json .
RUN npm install
RUN npm i pm2 -g
COPY . .
EXPOSE 8000
CMD ["pm2-runtime","app.js"]",
#.dockerignore

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# production
/build

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*

.dockerignorenode_modules폴더를 제외해주지 않으면 에러가 발생할 수 있다.


2. 이미지 빌드 후 DockerHub에 푸시하기

도커를 OS에 맞게 설치하고, 로컬 터미널에서 docker login을 한다.

도커파일이 있는 경로에서 이미지를 빌드한다.
도커 허브에 있는 레포지터리에 이름이 동일하도록 빌드했다.

WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested

M1칩 이슈인지 플랫폼 에러가 발생해서 --platform amd64을 추가하여 빌드한다.

docker build --platform amd64 -t whroddl2/just-do-it-backend:1.0.0 .
docker push whroddl2/just-do-it-backend:1.0.0

참고 )
태그명 변경
docker tag 이미지id whroddl2/just-do-it-backend:latest
이미지 삭제없이 태그만 삭제 할경우
docker rmi whroddl2/just-do-it-backend:tagname


3. 생성한 EC2에 Docker설치

생성한 EC2 instance 접속

get-docker.sh 다운로드
curl -fsSL https://get.docker.com -o get-docker.sh

ll 명령어로 현재 디렉토리에 get-docker.sh 파일 확인

get-docker.sh 실행하여 Dokcer 설치
sh get-docker.sh

EC2 인스턴스 내에서 docker login

linux에서 root 권한이 아닌 상태로 docker를 실행하면 권한 문제가 발생할 수 있다.

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied

해결방법
docker group에 해당 유저를 추가
docker group이 없다면 생성 sudo groupadd docker
docker group에 해당 유저를 추가 sudo usermod -aG docker \$USER
로그아웃 후 다시 로그인하거나 newgrp docker를 실행시켜야 적용


4. EC2 인스턴스에서 DockerHub 이미지 pull하고 컨테이너 run

AWS EC2에서 사용할 포트를 열어준다 (인바운드 규칙 편집)

EC2 터미널에서 이미지를 풀하고 포트를 설정해 컨테이너를 구동한다.
docker pull whroddl2/just-do-it-backend:1.0.0

docker run -p 8000:8000 whroddl2/just-do-it-backend:1.0.0

서버가 열렸따


5. postman으로 회원가입 플로우 확인

EC2 인스턴스의 퍼블릭 IP로 회원가입을 진행해서 서버가 잘 작동하는지 확인한다.


AWS RDS 엔드포인트로 들어간 데이터베이스에서도 회원가입 데이터가 잘 들어온걸 확인할 수 있다. 터미널을 닫아도 인스턴스 내에서 서버가 꺼지지 않고 작동한다.

블로커 확인

  • 컨테이너에서 PM2 작동 관련 -> pm2-runtime
  • process.dlopen 에러 -> .dockerignore node_modules 추가
  • docker build 플랫폼 에러 -> --platform amd64
  • EC2 Docker 로그인 -> group에 유저추가



참고)
https://stackoverflow.com/questions/68360501/docker-build-version-of-npm-is-incompatible-with-lockfileversion1
https://potato-hyun.tistory.com/34
https://stackoverflow.com/questions/71910780/docker-run-fails-return-process-dlopenmodule-path-tonamespacedpathfilename
https://www.npmjs.com/package/pm2

profile
https://lying-lettuce-69f.notion.site/KyoungchanCho-Blog-f9f150b9e3be4467a67cf2a21932650d (게시글 자동 비공개 현상으로 일단 노션으로 이동합니다. 소개에서 URL 링크 클릭으로 연결됩니다.)

0개의 댓글