들어가며
Node.js 앱을 Dockerfile을 통해 이미지로 생성하고, 이 이미지를 활용해 컨테이너에서 Node.js 앱을 실행해 보자.
기본 파일 생성
Node.js 코드 작성
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
- 컨테이너를 종료 후 재실행하면 변경사항이 반영됨을 확인 가능!
![]() |
![]() |
'Docker' 카테고리의 다른 글
[도커] 5장 Docker Compose (0) | 2024.10.28 |
---|---|
[도커] 3장 - 도커 이미지 생성 (0) | 2024.10.25 |
[도커] 2장 - 도커 클라이언트 명령어(컨테이너 나열, 생명주기, 명령어 실행) (0) | 2024.10.24 |
[도커] 1장 - 이미지, 컨테이너 (0) | 2024.10.23 |