Node.js 기반 Docker Image 만들기 - 1
Node.js 기반 Docker Image 만들기 - 2 (이 글)
Node.js 기반 Docker Image 만들기 - 3
https://nodejs.org/ko/docs/guides/nodejs-docker-webapp/
이번에는 앞서 만든 애플리케이션을 가지고 도커 이미지를 만드는 작업을 해요
도커 이미지가 무엇인지는 다음에 알아봐요
Dockerfile이라는 파일을 만들고 아래 내용을 추가해주세요
FROM node:12
# 앱 디렉터리 생성
WORKDIR /usr/src/app
# 앱 의존성 설치
# 가능한 경우(npm@5+) package.json과 package-lock.json을 모두 복사하기 위해
# 와일드카드를 사용
COPY package*.json ./
RUN npm install
# 프로덕션을 위한 코드를 빌드하는 경우
# RUN npm ci --only=production
# 앱 소스 추가
COPY . .
EXPOSE 8080
CMD [ "node", "index.js" ]
nodejs 공식 홈페이지에 나와있는 주석이 너무 훌륭해서 더 붙이는게 사족이 될 것 같지만 간단하게 덧붙이자면
WORKDIR는 working directory를 설정하는데 이 뒤로 나오는 RUN, CMD, ENTRYPOINT, COPY, ADD 명령어들은 다 이 WORKDIR에서 실행돼요. 그리고 Base Image 안에 WORKDIR로 지정한 경로의 폴더가 없다면 그 폴더를 얘가 만들어줘요. WORKDIR은 하나의 Dockerfile 안에서 여러번 실행될 수 있는데 상대경로와 절대경로 모두 사용할 수 있어요. 위 예제에서 WORKDIR /usr/src/app 이라고 하고 COPY . . 전에 WORKDIR app2 라고 썼다면 COPY . .이 실행되는 곳의 경로는 /usr/src/app/app2/ 가 돼요.
COPY package*.json ./는 Dockerfile이 있는 위치에서 package로 시작하는 json 파일들을 전부 다 WORKDIR로 복사해줘요
RUN npm install은 WORKDIR에서 npm install을 실행해줘요. 해주는데..
package*.json이 있는 상태에서 npm install을 실행하면 그 안에 있는 내용을 보고 필요한 패키지들을 node_modules 폴더에 설치해요. 설치한 패키지들이 많으면 이 폴더가 커질 수 있는데 도커 이미지 사이즈를 최대한 작게 하기 위해 이미지를 만들 때 부터 넣어놓지 않고 컨테이너를 생성할 때 패키지 설치를 하게 해요. RUN 명령어와 CMD 명령어는 다음에 자세하게 보아요.
EXPOSE 8080은 이 도커 이미지로 만든 컨테이너가 기본적으로 8080포트를 열고있다고 도커에게 알려주는 거에요. 기본은 TCP이고 따로 UDP인지 TCP인지 알려주는 것도 가능해요.
.dockerignore 라는 파일도 만들어주세요. 앞에 ( . )이 붙어있는 거 중요해요. 아래 내용을 추가해주세요.
node_modules
npm-debug.log
로컬에 있는 node_modules라는 폴더를 이미지로 복사해서 덮어쓰지 않게 하고 npm-debug.log 파일도 이미지 파일 안으로 복사되는 것을 막아줘요. .dockerignore 파일이 하는 일이 이런 거에요 자세한 건 다음에 알아봐요.
마지막으로 아래 명령어를 실행하면 진짜 도커 이미지가 만들어지게돼요. 그리고 docker image ls 혹은 docker images 명령어로 확인해보세요.
docker build . -t <your username>/node-web-app:1.0.0
docker image ls
docker build에서 ( . ) 빼먹지 않도록 주의해요. -t 옵션은 name:tag 형식으로 이미지 이름과 태그를 넣어주는 옵션이에요. 이번에 만든 이미지는 버전 1.0.0이다. 라고 말해주는 거에요.