[Node.js 앱 생성]
- 새로운 프로젝트 디렉토리를 만들고, 디렉토리에 애플리케이션과 의존성을 알려주는 package.json 파일 생성
{
"name": "docker_web_app",
"version": "1.0.0",
"description": "Node.js on Docker",
"author": "First Last <[email protected]>",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.16.1"
}
}
- 터미널에서 npm install 실행하면, package-lock.json 파일이 생성된다.
- express.js 프레임워크로 웹앱을 정의하는 server.js 생성
'use strict';
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(`Running on <http://$>{HOST}:${PORT}`);
[Dockerfile 생성]
- Dockerfile 이라는 빈 파일 생성
$ touch Dockerfile
- 텍스트 에디터로 Dockerfile의 내용 작성
# 어떤 이미지를 사용해서 빌드할 것인지 정의
# 여기서는 Docker Hub에 있는 node의 최신 LTS 버전 12 사용
FROM node:12
# 이미지 안에 애플리케이션 코드를 넣기 위한 디렉터리 생성
WORKDIR /usr/src/app
# 이 이미지에는 이미 Node.js와 npm이 설치되어 있으므로
# npm 바이너리로 앱의 의존성을 설치하기만 하면 된다.
# package.json과 package-lock.json을 모두 복사하기 위해 와일드카드 사용
COPY package*.json ./
RUN npm install
# 프로덕션을 위한 코드를 빌드하는 경우.
# npm ci 커맨드는 프로덕션 환경을 더 빠르고, 신뢰할 수 있고, 재현 가능한 빌드를 제공한다.
# RUN npm ci --only=production
# Docker 이미지 안에 앱 소스코드를 넣기 위해 COPY 지시어 사용
COPY . .
# 앱이 8080 포트에 바인딩 되어 있으므로 EXPOSE 지시어 사용하여 docker 데몬에 매핑
EXPOSE 8080
# 런타임을 정의하는 CMD로 앱을 실행하는 중요 명령어 정의
# 서버를 구동하도록 node server.js 를 실행하는 기본 npm start 사용
CMD [ "node", "server.js" ]