Node 서버를 운영하다 보면 다음과 같은 문제들이 생길 수 있다.
- 배포를 했더니 개발 환경과 운영 환경이 같지 않아서 문제가 발생한다.
- 다른 개발자와의 개발 환경이 달라 충돌이 발생한다.
- 가끔 패키지 관련 문제로 인해 서버 실행이 안 된다.
이 글에서는 이런 문제를 해결하기 위해
Docker → ECR → EC2 흐름으로
Node 서버를 배포하는 과정을 진행한다.
전체 흐름은 아래와 같다.
- Docker 이미지 빌드
- AWS ECR에 이미지 Push
- EC2에서 이미지 Pull
- Docker로 컨테이너 실행
Docker 이미지 빌드
Docker 이미지를 빌드하기 위해서는 Dockerfile이란 이름을 가진 파일이 필요하다. 아래와 같은 Dockerfile을 작성한다.
Dockerfile
FROM node:24-alpine
WORKDIR /app
# 의존성 먼저 복사 (캐시 활용)
# 소스 코드가 바뀌어도 package.json이 그대로면
# 해당 레이어는 캐시를 재사용할 수 있음
COPY package*.json ./
RUN npm install
# 컨테이너가 사용할 포트
EXPOSE 3000
# 컨테이너 시작 시 실행할 기본 명렁
CMD ["node", "dist/main"]
작성한 Dockerfile을 빌드한다.
docker build -t sample .
빌드가 완료되면 이미지가 정상적으로 생성되었는지 확인한다.
docker images
목록에 sample이 보이면 이미지가 정상적으로 생성된 것이다.
이미지를 만들었으면, 실제로 서버가 잘 뜨는지 확인해보자.
컨테이너 실행
docker run -d -p 3000:3000 --name sample-app sample
- -d: 백그라운드 실행
- -p 3000:3000: 로컬 3000 포트를 컨테이너 3000 포트와 연결
- --name sample-app: 컨테이너 이름 지정
실행 확인
docker ps
AWS ECR에 이미지 Push
이제 이미지를 서버에 전달해야 한다. 그 역할을 하는게 ECR이다.
ECR(Elastic Container Registry)이란?
- Docker Hub 같은 Docker 이미지 저장소
먼저 AWS console의 ECR에서 리포지토리를 생성한다.
해당 리포지토리에 이미지를 전달한다.
로그인
aws ecr get-login-password --region ap-northeast-2 \
| docker login \
--username AWS \
--password-stdin {ECR_URI}
이미지 태깅
docker tag sample:latest {ECR_URI}:latest
이미지 푸시
docker push {ECR_URI}:latest
ECR 리포지토리의 이미지 목록에 나타난다면 잘 된 것이다.
EC2에서 이미지 Pull
이제 ECR에 있는 이미지를 가져올 것이다.
로그인
aws ecr get-login-password --region ap-northeast-2 \
| docker login \
--username AWS \
--password-stdin {ECR_URI}
이미지 다운로드
docker pull {ECR_URI}:latest
이미지가 정상적으로 내려받아졌는지 확인해보자.
docker images
Docker로 컨테이너 실행
컨테이너 실행
docker run -d -p 3000:3000 --name sample-app {ECR_URI}:latest
실행 확인
docker ps
컨테이너 목록에 sample-app이 보이면 정상이다.
보안 그룹에서 3000 포트를 열었다면 브라우저에서 아래 주소로 확인할 수 있다.
http://EC2_PUBLIC_IP:3000
마무리
이 글에서는
"서버를 Docker 이미지로 만들고,
AWS ECR에 올리고,
EC2에서 이미지를 가져와 실행했다."
다음 글에서는 GitHub Actions를 사용하여 자동 배포가 이루어질 수 있도록 할 것이다.
'DevOps' 카테고리의 다른 글
| Docker를 이용하여 EC2에 Node 서버 배포하기 (2) (0) | 2026.05.11 |
|---|---|
| CloudWatch Logs와 Slack 통합: 에러 메시지 실시간 전송 설정 (0) | 2024.12.25 |
| Nest 프로젝트에 Pinpoint 적용 (0) | 2024.12.05 |
| CloudWatch를 이용해 알람 받기 (0) | 2024.01.28 |
| 로그 남기기 (0) | 2024.01.21 |