1. 전제사항
- Docker가 설치되어 있음
- NodeJS프로젝트가 준비되어 있음
포스팅하는데 사용한 프로젝트는 NodeJS express 웹 앱이며, 실행시 웹서버가 3000번 포트로 띄어져 REST API 요청 받아 처리 및 리턴해주는 역할을 해준다.
2. Dockerfile 생성
Docker를 사용하여 NodeJS 웹 앱을 도커라이징하면 모든 의존성을 소프트웨어 개발에서 컨테이너라고 부르는 표준화된 단위로 패키징할 수 있다.
Dockerfile이라는 빈 파일을 생성한다.
$touch Dockerfile
선호하는 텍스트 에디터로 Dockerfile을 연다.
처음으로 해야할 것은 어떤 이미지를 사용하여 빌드할 것인지를 정의하는 것이다. 이 포스트에서는 Docker Hub에 있는 node의 14버전을 사용할 것이다.
FROM node:14
다음으로 이미지 안에 애플리케이션 코드를 넣기 위해 디렉터리를 생성할 것이다. 이 디렉터리가 애플리케이션의 작업 디레겉리가 된다.
# 앱 디렉터리 생성
WORKDIR /usr/src/app
이 이미지에는 이제 NodeJS와 npm이 설치되어 있으므로 npm 바이너리로 앱의 의존성을 설치하기만 하면 된다.
# 앱 의존성 설치
# 가능한 경우(npm@5+) package.json과 package-lock.json을 모두 복사하기 위해 와일드카드를 사용
COPY package*.json ./
RUN npm install
이렇게 package.json, package-lock.json(존재할 시)파일을 복사하고 의존성 모듈들을 설치한다.
이제 Docker 이미지 안에 앱의 소스코드를 넣기 위해 COPY 지시어를 사용한다.
# 앱 소스 추가
COPY . .
앱이 바인딩 된 포트를 EXPOSE 지시어를 사용해서 docker 데몬에 매핑한다.
EXPORT 3000
마지막으로 런타임을 정의하는 CMD로 앱을 실행하는 중요 명령어를 정의한다. 여기서는 서버를 구동하도록 node index.js을 실행하는 기본 npm start을 사용한다.
CMD [ "node", "index.js" ]
이렇게 완성된 Dockerfile 내용은 다음과 같다.
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "node", "index.js" ]
.dockerignore 파일
Dockerfile과 같은 디렉터리에 .dockerignore파일을 다음 내용으로 만든다.
node_modules
이는 Docker 이미지에 로컬 모듈을 복사하는 것을 막아, 이미지 내에서 설치한 모듈을 덮어쓰지 않게 한다.
3. 이미지 빌드
작성한 Dockerfile이 있는 디렉터리로 가서 Docker이미지를 빌드한 다음 명령어를 실행한다. -t플래그로 유저/이미지이름 및 태그명을 부여할 수 있어서, 나중에 docker images 명령어로 쉽게 찾을 수 있다.
$docker build . -t <REPOSITORY_NAME/IMAGE_NAME:TAG_NAME>
-t 뒤에는 다음과 같이 올 수 있다.
- myimage
- myimage:0.1
- exampleuser/myimage
- exampleuser/myimage:0.1
빌드가 성공하고 나면, 아래와 같이 이미지를 확인할 수 있다.
$docker images
4. 이미지 실행
-d로 이미지를 실행하면 분리 모드로 컨테이너를 실행해서 백그라운드에서 컨테이너가 돌아가도록 한다. -p 플래그는 공개 포트를 컨테이너 내의 비공개 포트로 리다이렉트 한다.
앞에서 만든 이미지를 실행한다.
$docker run -p 3000:3000 -d <IMAGE_TAG_NAME>
이후 컨테이너가 잘 실행되었는지 확인한다.
$docker ps
위의 사진과 같이 STATUS에 Up으로 출력되면 정상 실행중인 것이다.
이후 REST API요청을 해보아, 정상적으로 리턴이 오는지 확인한다.
로컬에서 실행한 후의 결과와 동일하게 실행 결과가 나타난다면 성공한 것이다.
컨테이너 안에 들어가봐야 한다면 exec 명령어를 사용할 수 있다.
$ docker exec -it <container id> /bin/bash
방금 실행하였던 컨테이너 ID로 들어가보면, 아래와 같이 작업 디렉터리에 프로젝트가 들어 있음을 확인할 수 있다.
다음 링크에서 Docker와 Docker에서의 NodeJS에 대한 정보를 더 자세히 볼 수 있다.
- 공식 Node.js Docker 이미지
- Node.js Docker 사용사례 문서
- 공식 Docker 문서
- Stack Overflow에 Docker 태그로 올라온 질문
- Docker 레딧
#References
https://nodejs.org/ko/docs/guides/nodejs-docker-webapp/
'Server > Docker' 카테고리의 다른 글
[Docker] Ubuntu 18.04에 docker 설치하기 (0) | 2024.07.13 |
---|---|
(Docker) 알고 있어야 할 상위 10가지 Docker 명령 (0) | 2024.02.16 |
도커와 Containerization (0) | 2024.02.14 |
[Docker] Dockerfile에 대해 (0) | 2022.05.02 |
[Docker] Docker에 대해 (0) | 2022.05.02 |