본문 바로가기

STUDY/Docker & Kubernetes: 실전 가이드 -2022년판

13. 유틸리티 컨테이너

어플리케이션 컨테이너 VS 유틸리티 컨테이너

 

우리가 지금까지 만들어온 컨테이너는 일반적인 어플리케이션 컨테이너이다. 어플리케이션 컨테이너는 실행환경와 어플리케이션을 모두 포함하고 있고 그 어플리케이션을 실행하기 위해 존재한다. 그에 반해 유틸리티 컨테이너는 실행환경만 포함하고 있다. 즉 nodejs, jdk 등 실행환경은 있으나 실제 동작시킬 앱은 없다는 말이다. 그렇다면 유틸리티 컨테이너는 왜 필요한 걸까? 여러 어플리케이션을 개발하다보면 여러 개발환경을 세팅하느라 번거로운 경우가 많다. 심지어 같은 nodejs라도 다른 버젼으로 다시 설치해야 하는 경우도 있다. 이때 유틸리티 컨테이너를 사용하면, 로컬에 환경을 세팅할 필요 없이 유틸리티 컨테이너를 통해 해당 환경이 세팅된것처럼 명령어를 사용할 수 있다.

 

 


유틸리티 컨테이너

 

// 로컬에서 nodejs없이 npm init를 수행했다.
> docker --name node run -it -d node
> docker exec -it node npm init
> docker stop node
// 이렇게도 할 수 있다.
> docker run -it node npm init

nodejs 프로젝트를 만든다고 생각해보자. 먼저 nodejs 환경 세팅을 위해 홈페이지에 방문해서 적절한 버전의 nodejs를 로컬에 설치해야 할 것이다. 그리고 npm init을 수행해야 비로소 package.json 파일이 생성되면서 프로젝트 시작을 위한 패키지들을 설치할 수 있어진다. 하지만 node 컨테이너를 사용하면 로컬에 nodejs 설치 없이 nodejs가 있는것처럼 npm init 명령을 수행하게 할 수 있다. 이것이 유틸리티 컨테이너를 사용하는 이유이다.

 

 


유틸리티 컨테이너 구축

 

// Dockerfile
From node:14-alpine
WORKDIR /app

 

> docker build --tag node-util .
> docker run -it -v ${pwd}/app:/app node-util npm init
> docker run -it -v ${pwd}/app:/app node-util npm install

 

유틸리티 컨테이너를 직접 만들어보자. nodejs 14버전 유틸리티 컨테이너를 만들기위해 node:14-alpine을 기반으로 하는 node-util 이미지를 만들었다. 그리고 node-util 이미지는 컨테이너로 실행하면서 npm init, npm install 명령어를 수행하도록 하면 package.json 파일과 node_modules 폴더가 생성된다.

 

// Dockerfile
From node:14-alpine
WORKDIR /app
ENTRYPOINT [ "npm" ]

 

> docker build --tag  mynpm .
> docker run -it -v ${pwd}/app:/app mynpm init
> docker run -it -v ${pwd}/app:/app mynpm install

ENTRYPOINT를 사용하면 더욱 효율적인 유틸리티 컨테이너를 만들 수 있다. ENTRYPOINT는 컨테이너 실행시에 가장 먼저 입력되고 실행되는 명령어라고 생각하면 된다. npm을 ENTRYPOINT로 지정한 mynpm 이미지를 만들었기 때문에, 컨테이너로 실행할 때 init, install만 추가 명령어로 입력해주어도 된다.

 

 


도커 컴포즈

 

version: '3.8'
services:
  npm:
    build: ./
    stdin_open: true
    tty: true
    volumes:
      - ./app:/app

 

> docker-compose run --rm npm init
> docker-compose run --rm npm install

 

도커 컴포즈에서도 유틸리티 컨테이너를 설정하면 사용할 수 있다. 

728x90