Docker를 사용하여 간단한 Node.js 애플리케이션을 컨테이너화하고 실행하는 과정을 알아보겠습니다.
Docker를 활용하면 애플리케이션을 독립적인 환경에서 실행할 수 있어 배포와 관리가 용이해지며 Node.js 애플리케이션을 Docker 컨테이너로 변환하고 실행하는 방법을 알아보겠습니다.
포스팅 목차
1. Docker Desktop 설치
docker가 설치가 안되있으신 분들은 아래 링크를 통해 설치를 해주시면됩니다.
리눅스에서의 설치 방법이며 다른 OS들은 설치가 간단하여 넘기도록 하겠습니다.
2. Node.js 애플리케이션 준비
Node.js 애플리케이션을 준비합니다.
1. const express = require(‘express’);
- Express.js 모듈을 가져와서 express 변수에 할당
- Express.js는 Node.js를 위한 웹 애플리케이션 프레임워크로, 서버를 쉽게 구축할 수 있도록 도와줍니다.
2. const app = express();
- Express 애플리케이션 인스턴스를 생성하여 app 변수에 할당
- 이 인스턴스를 사용하여 라우트와 미들웨어를 설정할 수 있습니다.
3. const PORT = process.env.PORT || 3000;
- 서버가 수신 대기할 포트를 설정
- process.env.PORT는 환경 변수에서 포트를 가져오며, 설정되지 않은 경우 기본값으로 3000을 사용합니다.
- 서버가 다양한 환경에서 실행될 수 있도록 유연성을 제공합니다.
4. app.get(‘/’, (req, res) => { … });
- HTTP GET 요청에 대한 라우트를 설정
- 루트 URL(/)로 요청이 들어오면, “Hello, Docker!”라는 응답을 보냅니다.
5. app.listen(PORT, () => { … });
- 지정된 포트에서 서버를 시작하고 수신 대기
- 서버가 시작되면 콘솔에 “Server is running on port [PORT]” 메시지를 출력합니다.
- 서버가 정상적으로 실행되고 있음을 확인하는 데 유용합니다.
// app.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.send('Hello, Docker!');
});
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
package.json
파일을 생성하여 필요한 패키지를 추가합니다.
1. “name”: “docker-node-app”
- 프로젝트의 이름을 지정
- 이 경우, 프로젝트 이름은 docker-node-app입니다.
2. “version”: “1.0.0”
- 프로젝트의 버전을 지정
- 일반적으로 주버전.부버전.수정버전 형식을 따릅니다.
3. “main”: “app.js”
- 애플리케이션의 진입점 파일을 지정
- app.js 파일이 애플리케이션의 시작 파일입니다.
4. “scripts”: { “start”: “node app.js” }
- 프로젝트에서 사용할 수 있는 명령어 스크립트를 정의
- “start” 스크립트는 node app.js 명령어를 실행하여 애플리케이션을 시작합니다.
- 터미널에서 npm start 명령어를 실행하면 이 스크립트가 실행됩니다.
5. “dependencies”: { “express”: “^4.17.1” }
- 프로젝트가 의존하는 외부 패키지를 정의
- express 패키지의 버전 4.17.1 이상, 5.0.0 미만의 버전을 사용
- ^ 기호는 SemVer(유의적 버전) 규칙에 따라 호환 가능한 최신 버전을 설치하도록 합니다.
{
"name": "docker-node-app",
"version": "1.0.0",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.17.1"
}
}
3. Dockerfile 생성
애플리케이션을 컨테이너화하기 위해 Dockerfile을 생성
1. FROM node:14
- Node.js의 버전 14 이미지를 기반으로 새로운 이미지를 생성
- Docker Hub에서 Node.js 14 버전을 가져옵니다.
2. WORKDIR /app
- 컨테이너 내에서 작업 디렉토리를 /app으로 설정
- 이후 명령어들은 이 디렉토리에서 실행됩니다.
3. COPY package*.json ./
- 현재 디렉토리의 package.json과 package-lock.json 파일을 컨테이너의 현재 작업 디렉토리로 복사합니다.
- 종속성 설치에 필요한 파일들만 먼저 복사하여 Docker 캐시를 효율적으로 사용합니다.
4. RUN npm install
- 컨테이너 내에서 npm install을 실행하여 package.json에 명시된 모든 종속성을 설치합니다.
- Node.js 애플리케이션이 실행되기 위해 필요한 패키지들을 설치합니다.
5. COPY . .
- 현재 디렉토리의 모든 파일을 컨테이너의 현재 작업 디렉토리로 복사합니다.
- 소스 코드와 관련 파일들이 컨테이너로 복사됩니다.
6. CMD [“node”, “app.js”]
CMD ["실행파일", "파라미터1", "파라미터2", ...] #기본형식.
- “node”: Node.js 런타임을 실행
- “app.js”: 실행할 JavaScript 파일
7. EXPOSE 3000
- 컨테이너가 외부와 통신할 때 사용할 포트를 지정합니다.
- 컨테이너의 3000번 포트를 외부에 노출합니다.
- 애플리케이션이 이 포트에서 수신 대기할 것임을 나타냅니다.
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
EXPOSE 3000
4. Docker 이미지 빌드
터미널을 열고 애플리케이션이 있는 디렉토리로 이동한 후, Docker 이미지를 빌드합니다.
docker build -t docker-node-app .
5. Docker 컨테이너 실행
이미지가 성공적으로 빌드되면, 컨테이너를 실행합니다.
docker run -p 3000:3000 docker-node-app
호스트의 3000 포트를 컨테이너의 3000 포트와 연결합니다.
6. 애플리케이션 접근
브라우저를 열고 http://localhost:3000에 접속하면 “Hello, Docker!”라는 메시지를 확인할 수 있습니다.