Docker

[도커] 4장 Docker를 활용한 Node.js 애플리케이션 컨테이너화 과정

초코chip 2024. 10. 27. 17:21

들어가며

Node.js 앱을 Dockerfile을 통해 이미지로 생성하고, 이 이미지를 활용해 컨테이너에서 Node.js 앱을 실행해 보자.

기본 파일 생성

Node.js 코드 작성

  1. npm init으로 Node.js 프로젝트를 시작한 후, index.js 파일에 다음 코드를 작성:
const express = require("express");

const PORT = 8080;
const HOST = '0.0.0.0';

//APP
const app = express();
app.get('/', (req,res) =>{
    res.send("hellow world")
});

app.listen(PORT);
console.log(`run : ${HOST}:${PORT}`)

 

Dockerfile 작성

  • Node.js 앱을 실행할 수 있는 베이스 이미지를 선택
  • npm install 명령어를 통해 package.json의 패키지 설치
  • Node.js 앱을 실행하는 명령어 추가 (node <시작파일>)

 

 

 

오류 발생 - COPY 명령어

  • 이미지를 빌드할 때 임시 컨테이너가 생성되지만, 임시 컨테이너에는 로컬의 Node 관련 파일이 포함되지 않음.
  • 따라서 프로젝트 폴더 내용을 컨테이너 내부에 넣기 위해 COPY 명령어 사용:
    • COPY <복사 할 파일 경로(로컬)> <복사될 경로(컨테이너 내부)>

 

 

더보기
잉? 그러면 이전 강의에서 새로운 파일 스냅샷이 컨테이너에 들어가서 이미지를 생성한다는거는 뭐였지?

 

Working 디렉토리 설정

  • 정의: 애플리케이션 소스 코드를 보관할 디렉토리 생성
  • 이유: 루트 디렉토리에서 작업 시 베이스 이미지의 파일과 혼재하여 가독성이 떨어질 수 있음.

  • WORKDIR 설정으로 기본 디렉토리 지정 가능

 

 

포트 포워딩

  • 컨테이너는 격리된 공간이므로 호스트 네트워크에 직접 접근할 수 없음.
  • 호스트와 컨테이너의 네트워크를 연결하려면 포트 포워딩 필요:
    • -p <호스트 포트번호>:<컨테이너 포트번호>
    • # 예시: docker run -p 49160:8080 finaluserplease1/node-docker

 

 

코드 변경 시 재빌드 문제 해결

현재는 코드가 변경되면 이미지를 새로 생성하고 컨테이너를 다시 실행해야 하는 비효율이 있음.

 

효율적인 코드 변경 방법

패키지 설치와 코드 분리

  • 현재 Dockerfile 구조에서는 파일이 변경될 경우 npm install이 다시 실행됨.
  • 이를 방지하기 위해 프로젝트 종속성과 코드 파일을 분리!
  • 이렇게 해주면 단순 코드만 변경을 해주었을때 패키지를 재설치하는 비효율성을 없앨 수 있음

하지만, 여전히 코드가 변경되면 다시 이미지를 빌드하고 컨테이너를 실행해야 하는 문제는 남아 있음.

 

Docker Volume 활용

  • COPY 방식은 빌드 시점에만 작동하므로, volume을 사용하면 호스트 파일을 매핑해 실시간으로 변경 사항 적용 가능:
    • -v /usr/src/app/node_modules: 호스트 디렉토리에 없는 폴더는 매핑하지 않도록 지정
    • -v $(pwd):/usr/src/app: 호스트의 현재 디렉토리와 컨테이너의 work 디렉토리를 매핑
    • docker run -p 8888:8080 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app finaluserplease1/node-docker
  • 컨테이너를 종료 후 재실행하면 변경사항이 반영됨을 확인 가능!