Server/Docker

[도커(docker)] Dockerfile를 이용하여 nodejs & express 서버 설치 및 개발 환경 구성하기

너무 궁금해 2025. 2. 12. 16:52

[도커(docker)] Dockerfile를 이용하여 nodejs & express 서버 설치 및 개발 환경 구성하기 

📢  작성순서 

📌 Node.js Express 서버 코드 작성

📌 Docker 설정 파일 작성

📌 Docker 컨테이너 실행

📌  Node.js Express 서버 코드 작성

📝 프로젝트 디렉토리 생성

터미널에서 아래 명령어를 실행하여 프로젝트 디렉토리를 만든다

mkdir docker-nodejs
cd docker-nodejs

📝 Node.js 프로젝트 초기화

아래 명령어를 실행하여 package.json 파일을 생성한다.

npm init -y

📝 Express 설치

아래 명령어를 실행하여  Express 프레임워크를 설치한다.

npm install express

🛠  package.json 파일 내용을 확인합니다.

📝 Express 서버 코드 작성

server.js 파일을 생성하고 아래 코드를 입력한다.

const express = require('express');

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

const app = express();

app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(PORT, HOST);
console.log(`Server running at http://${HOST}:${PORT}/`);

📝 Express 서버 실행 

터미널에서 아래 명령어를 입력하여 서버를 실행합니다.

node server.js
결과 > Server running at http://0.0.0.0:8080/

🛠  브라우저를 이용해 실행 화면을 확인합니다.

터미널에서 확인 후 종료한다(Ctrl + C) 


📌  Docker 설정 파일 작성

📝 Dockerfile 파일 생성

Dockerfile의 이름으로 파일을 만들고 다음 내용을 추가한다.

FROM node

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install 

COPY ./ ./

EXPOSE 8080 

CMD ["node", "server.js"]

🛠  Dockerfile 작성에 사용된 명령어 설명

# 1. Node.js 베이스 이미지 사용
FROM node:18

# 2. 작업 디렉토리 생성
WORKDIR /usr/src/app

# 3. package.json과 package-lock.json 복사
# 3, 4, 5번 순서 주의!!! 
# 불필요한 npm install 작업을 줄여준다. 
COPY package*.json ./

# 4. npm 패키지 설치
RUN npm install

# 5. 애플리케이션 소스 코드 복사
COPY . .

# 6. 컨테이너에서 사용할 포트 지정
EXPOSE 3000

# 7. 서버 실행
CMD ["node", "server.js"]

📌  Docker 컨테이너 실행

📝 Docker 이미지 빌드

  아래 명령어를 실행하여 도커 이미지를 빌드한다.

docker build -t my-express-app .

📝 컨테이너 실행

  이미지를 빌드한 후 컨테이너를 실행한다.

docker run -p 3000:8080 my-express-app

🛠 이제 http://localhost:3000에 접속하면 Docker 컨테이너에서 Express 서버가 실행된다.

📝 volume 설정 

  volume를 설정하면 이미지를 재생성하지 않아도 프로그램 소스를 변경할 수 있습니다.

docker run -p 3000:8080 -v /usr/src/app/node_modules -v %cd%:/usr/src/app my-express-app

🛠 명령에 대한 설명입니다. 

docker run \
  -p 3000:8080 \                     
  # 로컬 호스트의 3000번 포트를 컨테이너의 8080 포트에 매핑
  # 로컬 호스트의 3000번 포트로 접속하면 컨테이너 내부의 8080 포트로 요청이 전달됨.
  
  -v /usr/src/app/node_modules \      
  # 컨테이너 내부의 'node_modules' 디렉토리를 호스트와 공유하지 않음 (빈 볼륨 마운트)
  # 이렇게 하면 node_modules가 호스트의 영향을 받지 않고 컨테이너 내에서만 유지됨.
  
  -v %cd%:/usr/src/app \              
  # 현재 디렉터리 (%cd%)를 컨테이너의 '/usr/src/app' 디렉터리에 마운트 (윈도우 기준)
  # 이를 통해 로컬에서 파일을 수정하면 컨테이너 내부에서도 반영됨.
  # %cd%는 Windows cmd에서 현재 디렉토리를 의미함.
  # Linux/macOS에서는 $PWD를 사용하여 대체
  
  my-express-app                      
  # 'my-express-app'이라는 이름의 도커 이미지로 컨테이너 실행
  # 사전에 docker build -t my-express-app . 같은 명령어로 빌드되었어야 함.

  소스 수정후 컨테이너를 재시작하면 변경사항이 적용됩니다. 

docker restart 컨테이너-이름