4.3.애플리케이션 빌드 실전 예제: Node.js 소스 코드

  • Node.js 애플리케이션을 빌드하는 스크립트
  • 파이썬, PHP, 루비 등 여타 스크립트 언어에 그대로 적용 가능
  • Node.js 애플리케이션은 인터프리터형 언어인 자바스크립트를 사용. 컨테이너화 된 Node.js 애플리케이션을 실행하려면 Node.js 런타임과 소스코드가 애플리케이션 이미지에 포함돼야 한다.
  • 그럼에도 멀티 스테이지 빌드를 사용한다. 멀티 스테이지 빌드를 통해 의존 모듈을 최적화 할 수 있다.

npm을 사용해 Node.js 애플리케이션을 빌드하는 Dockerfile 스크립트

001) FROM diamol/node AS builder
002) 
003) WORKDIR /src
004) COPY src/package.json .
005) RUN npm install
006) 
007) # app
008) FROM diamol/node
009) 
010) EXPOSE 80
011) CMD ["node", "server.js"]
012) 
013) WORKDIR /app
014) COPY --from=builder /src/node_modules/ /app/node_modules/
015) COPY src/ .

Dockerfile 스크립트 빌드

  • 내려받은 의존 모듈은 도커 이미지 레이어 캐시에 저장되므로 의존 모듈 추가 없이 코드만 수정했다면 그 다음 번 빌드는 지금보다 매우 빠르게 진행된다.
001)  docker build -t access-log .
002) [+] Building 8.5s (13/13) FINISHED                                                                                                                                                                       
003)  => [internal] load build definition from Dockerfile                                                                                                                                                0.0s
004)  => => transferring dockerfile: 265B                                                                                                                                                                0.0s
005)  => [internal] load .dockerignore                                                                                                                                                                   0.0s
006)  => => transferring context: 2B                                                                                                                                                                     0.0s
007)  => [internal] load metadata for docker.io/diamol/node:latest                                                                                                                                       2.5s
008)  => [auth] diamol/node:pull token for registry-1.docker.io                                                                                                                                          0.0s
009)  => [internal] load build context                                                                                                                                                                   0.0s
010)  => => transferring context: 1.57kB                                                                                                                                                                 0.0s
011)  => CACHED [stage-1 1/4] FROM docker.io/diamol/node@sha256:dfee522acebdfdd9964aa9c88ebebd03a20b6dd573908347be3ebf52ac4879c8                                                                         0.0s
012)  => [builder 2/4] WORKDIR /src                                                                                                                                                                      0.0s
013)  => [stage-1 2/4] WORKDIR /app                                                                                                                                                                      0.0s
014)  => [builder 3/4] COPY src/package.json .                                                                                                                                                           0.0s
015)  => [builder 4/4] RUN npm install                                                                                                                                                                   5.5s
016)  => [stage-1 3/4] COPY --from=builder /src/node_modules/ /app/node_modules/                                                                                                                         0.2s 
017)  => [stage-1 4/4] COPY src/ .                                                                                                                                                                       0.0s 
018)  => exporting to image                                                                                                                                                                              0.1s 
019)  => => exporting layers                                                                                                                                                                             0.1s 
020)  => => writing image sha256:75c06b0cf1fc9548ab9bba56eaf3d37c1f4d895b39d6b3f1b28bf736aa9da1ff                                                                                                        0.0s 
021)  => => naming to docker.io/library/access-log

컨테이너 실행

  • 이 애플리케이션은 다른 서비스로부터 호출을 받아 로그를 남기는 REST API
  • HTTP POST 엔드포인트를 통해 남길 로그를 접수하며 GET 엔드포인트를 통해 현재까지 기록된 로그 건수를 알려준다.
001)  docker container run --name accesslog -dp 801:80 --network nat access-log
002) 1f6bef013f1888725f63725c10a5635fd874c622e3c97c969d0f364b370da787

http://localhost:801/stats 로 접근하면 지금까지 남긴 로그 건수를 확인할 수 있다.

{"logs":0}

links

social