[Docker] Dockerfile로 Node.js 파일을 Docker 이미지로 만드는 방법

회사에서 프로그램을 SaaS 형태로 배포하기 위해, MySQL dump와 서비스 코드를 포함하는 Dockerfile을 작성하고 AWS ECR에 push하는 작업이 필요했다. 또한, PoC(Proof of Concept)를 위한 테스트 코드를 위해서도 별도의 Dockerfile을 생성해야 하는 일도 있었다.

 

따라서 오늘은 Docker 기본 개념 알아보고, Node.js 작성된 테스트 코드를 Dockerfile 구성하여 빌드하는 과정을 진행할 예정이다. 과정을 통해 Docker 이미지가 생성되며, 생성된 이미지를 실행하여 테스트하는 전체 과정을 단계별로 설명하는 글을 작성해보려고 한다.

Docker란?

  • Docker가 개발 중인 컨테이너 기반의 오픈소스 가상화 플랫폼
  • 핵심은 컨테이너 이미지
  • 특징
    1. 애플리케이션이 움직이는 환경을 컨테이너라는 단위로 가상화
    2. 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함
    3. 컨테이너의 베이스가 되는 이미지를 효율적으로 만드는(빌드) 기능
    4. 이미지를 배포하기 위한 구조(Docker Hub과 같은 저장소 서비스)를 갖추고 있다.

 

컨테이너(Container)란?

  • 우리가 흔히 알고 있는 컨테이너는 배에 실는 네모난 화물 수송용 박스로 생각할 수 있다.
  • 각각의 컨테이너 안에는 옷, 신발, 전자제품, 술, 과일등 다양한 화물을 넣을 수 있고, 규격화되어 컨테이너선이나 트레일러등 다양한 운송수단으로 쉽게 옮길 수 있다.

 

그렇다면 서버에서 컨테이너란 무엇을 뜻하는 것일까?

  • 컨테이너는 격리된 공간에서 프로세스가 동작하는 기술
  • 단순히 프로세스를 격리하기 때문에 가볍고 빠르다.
  • CPU나 메모리는 프로세스가 필요한 만큼만 추가 사용하여서 성능적으로 거의 손실이 없다.

 

Docker 이미지(Image)

  • 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것
  • 상태 값을 가지지 않고 변하지 않는다.
  • 추가되거나 변하는 값은 컨테이너에 저장된다.
  • 같은 이미지에서 여러 개의 컨테이너를 만들 수 있고 컨테이너의 상태가 바뀌거나 삭제되어도 이미지는 변하지 않고 그대로 남아있다.
  • 도커 이미지는 Docker Hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다.

 

Docker의 장점

  1. 환경 일관성 및 이식성
    • Docker는 개발, 테스트, 그리고 프로덕션 환경에서 동일한 환경을 보장한다.
    • 이는 환경 설정의 차이로 인한 문제를 최소화하고, 서로 다른 시스템 또는 클라우드 서비스에서도 애플리케이션을 쉽게 이동시킬 수 있게 한다.
  2. 분리 및 보안
    • 각 Docker 컨테이너는 다른 컨테이너 및 호스트 시스템으로부터 격리된다.
    • 이는 서로 다른 애플리케이션들이 서로 영향을 미치지 않으면서 동시에 실행될 수 있음을 의미한다.
    • 또한, 보안 측면에서도 하나의 컨테이너가 손상되더라도 다른 컨테이너나 호스트 시스템은 보호된다.
  3. 경량성 및 빠른 시작
    • Docker 컨테이너는 가상머신(VM)보다 훨씬 가벼워 시스템 자원을 적게 소모한다.
    • 또한, 컨테이너는 VM에 비해 빠르게 시작되고 중단된다.
    • 이는 리소스를 효율적으로 사용하고, 빠른 배포 및 확장을 가능하게 한다.
  4. 버전 관리 및 빠른 롤백
    • Docker 이미지는 버전 관리가 가능하며, 필요시 이전 버전으로 빠르게 롤백할 수 있다.
    • 이는 애플리케이션의 업데이트와 유지보수를 용이하게 하며, 안정성을 향상시킨다.
  5. 개발 협업 용이성
    • 개발자는 Docker 사용하여 자신의 로컬 환경에서 애플리케이션을 개발하고 테스트할 있으며, 동일한 Docker 설정을 공유함으로써 팀원 간의 협업이 용이해진다.
    • 이는 개발 과정의 일관성을 유지하고, 실수를 줄이는 도움이 된다.

 

Dockerfile이란?

  • Dockerfile은 간단히 말해서 docker에서 이미지를 생성할 수 있는 이미지 설정 파일이다.
  • Dockerfile로 Docker Container에 설치해야 하는 Packages, Source Code, 명령어, 환경변수설정 등을 해줄 수 있다.
  • FROM과 RUN 명령으로 도커 이미지를 만들 수 있다.

 

개념이 어느정도 정리 되었다면  Dockerfile을 만들고, Docker 이미지 실습 단계로 넘어가보자.

 

1. 환경세팅(테스트 코드)

Dockerfile을 작성하기 전에 Docker위에 올릴 간단한 node.js express 환경이 필요하다.

https://ranna.tistory.com/14

 

아주 간단한 Node.js express 만들기

회사에서 Dockerfile에 올릴 테스트 코드를 작성하기 위해, 기본 Node.js express를 만들어야 하는 상황이 생겼다. 간단한 node.js express 환경을 만들어보자. (로컬에 node.js와 npm이 설치 되어 있어야 한다.)

ranna.tistory.com

위 링크에 따라 node.js express 환경 설정을 마쳤다면 다음 단계로 넘어가보자.

 

2. Dockerfile 작성하기

# From base image node
FROM node:16

# Create app directory
RUN mkdir -p /usr/src/app

# Set the /usr/src/app directory to WORKDIR
WORKDIR /usr/src/app

# Copying all the files from your file system to container file system
COPY package.json .

# Install all dependencies
RUN npm install

# Copy other files too
COPY ./ .

# Expose the port
EXPOSE 8000

# Command to run app when intantiate an image
CMD ["npm","start"]


3. Dockerfile 빌드하기 - Docker image 생성

docker build -t [image명:태그명] . 
# ex) docker build -t node-hello:latest .

-t 옵션: 생성된 이미지에 이름을 부여한다. 

# 도커 이미지 생성 확인
docker images


4. Docker image 실행하기

docker run -d -p [접속할 포트]:[컨테이터포트] [생성한이미지/태그명]
# ex) docker run -d -p 8000:8000 node-hello:latest

 

Docker image를 실행 시킨 후 localhost:8000에 접속해서 'Hello World!'가 잘 찍히는지 확인한다.

 

매우 간단하게 도커 이미지를 생성하고, 실행한 뒤 도커 이미지가 정상적으로 실행되는 것을 볼 수 있었다.