본문 바로가기
개발공부 개발새발/Docker

Docker ) 유틸리티 컨테이너

by 휴일이 2024. 4. 3.

유틸리티 컨테이너

애플리케이션이 아닌, 특정 환경만 포함하는 컨테이너, (NodsJS 실행 환경이나 PHP 실행 환경 등.)

실습

docker run -it -d node
  • 노드 컨테이너를 실행시킨다.
  • 이 때, -d 로 컨테이너에 접속하지는 않는다.
  • 다만 -it 로 입력을 받는 것을 대기하는 상태로는 놔둔다.
docker exec -it CONTAINER_NAME npm init
  • 실행 중인 컨테이너에 추가 명령을 실행하기 위해 exec 로 접속한다.
    • 메인 프로세스를 중단시키지 않고 컨테이너 내부에 작성된 로그 파일을 읽는 등에 유용함.
  • 다른 명령도 계속 입력받도록 -it 를 추가한다.
    • 이거 두 개를 함께 해야 제대로 접속해서 명령을 입력할 수 있음.
  • 저 이름 컨테이너에 npm init 을 입력받는다고 생각하면 된다.

저 명령을 치고 들어가서 npm init 을 수행하면..

  • 이렇게 node 종속성 설치 ( package.json ) 을 완료할 수 있다 😊
  • 내 컴퓨터에 노드를 설치하지 않고도 도커로 노드 환경을 만들 수 있다는 사실~
💡 노드는 내부적으로 입력받을 수 있는 상태여야지만 컨테이너가 실행되고 아니면 중지된다.

 

Another way

docker run -it node npm init
  • node 이미지를 기반으로 컨테이너를 실행시키는데
  • 이 때 npm init 명령어와 함께 실행한다. 그러면…

  • 인터렉티브 모드로 컨테이너가 올라가면 아까처럼 똑같이 구성 설정을 스크립트로 입력받을 수 있는 상태가 되고

 

  • 입력이 끝나면 컨테이너가 중지될 것이다.
    • 노드 종속성 ( package.json ) 추가 후 컨테이너가 중지된 것이다.

유틸리티 컨테이너 구축하기

Dockerfile

# 슬림, 최적화된 노드 기반 이미지
FROM node:14-alpain

WORKDIR /app

# 사용자가 이미지에 대한 모든 명령을 할 수 있도록 명령어 설정하지 않음.
# CMD npm init

COMMAND

# 도커파일 기반으로 이미지 빌드
docker build -t node-util .

docker run -it \\
# 앱 실행 폴더를 호스트머신 폴더와 바인드 마운트한다. (컨테이너 내부와 호스트 폴더 공유)
# npm init 으로 init 된 package.json 이 이젠 호스트 폴더에 저장된다. :) !
-v /Users/holidayk/Desktop/docker-study/docker-utility-container:/app \\
node-util npm init
  • 유틸리티 컨테이너로 호스트 머신에 모든 부가 도구를 설치하지 않고도 호스트 머신에 영향을 미치는 것을 실행할 수 있다. (feat. bind mount)

  • docker run ~ npm init 명령어로 종속성 파일을 만든 모습 😊
  • 호스트 머신에 직접 노드를 설치하지 않았는데도 유틸리티 컨테이너로 구성한 모습이다! ! !
  • node 설정은 그나마 괜찮은데 PHP & Laravel 은….ㄷㄷㄷㄷ (다음이시간에..)

ENTRYPOINT

  • docker run ~ IMAGE_NAME 이미지 이름 뒤에 오는 명령어를 이 명령어 뒤에 오도록 제한.
    • 컨테이너에서 실수로 모든 것을 삭제하는 명령어를 내릴 수도 있지 않은가?
    • 사전 통제해야할 필요가 있다.

Dockerfile

# 슬림, 최적화된 노드 기반 이미지
FROM node:14-alpine

WORKDIR /app

# 사용자가 이미지에 대한 모든 명령을 할 수 있도록 명령어 하지 않음.
# CMD npm init

# docker run ~ 에서 이미지 이름 뒤의 명령어를 이 명령어 뒤에 오도록 제한한다.
# 컨테이너를 실행할 때 잘못된 명령 못들어가게 통제
ENTRYPOINT [ "npm" ]

COMMAND

# 1
docker run -it -v /Users/holidayk/Desktop/docker-study/docker-utility-container:/app \\
node-util \\
# ENTRYPOINT(npm) 이 앞에 붙으니까 init 만 하면 npm install 명령어 사용 가능 !
install 

# 2
docker run -it -v /Users/holidayk/Desktop/docker-study/docker-utility-container:/app \\
mynpm \\
# npm install 명령이 이 프로젝트에 대한 종속성으로 express 패키지를 추가하도록 허용하는 플래그
install express --save

Docker-Compose 사용 !

유틸리티 컨테이너에도 사용 가능해요!

docker-compose.yml

version: '3.8'
services:
  npm:
    # 루트 패스에 있음.
    build: ./
    # -it
    stdin_open: true
    tty: true
    volumes:
      - ./:/app

COMMAND

docker-compose run npm init
  • docker-compose 에 run SERVICE_NAME 을 사용하면 컴포즈 파일에 있는 서비스 중에서 특정 파일만 실행 가능하다. → 위에서 npm 을 넣었으니까 😊
  • 단, run 명령은 up 명령과 달라 --rm 이 추가되지 않는다.
    • 그러니 필요하다면 명령어에 --rm 을 추가해주자
      • docker-compose run --rm npm init …

  • 요렇게 이미지 빌드 후

  • 바로 실행되어 버리기 ! ㅎㅅㅎ

유틸리티 컨테이너..

  • 공식 용어가 아니지만, 환경만 존재하는 컨테이너를 부른다고 생각하자!
  • 모든 도구를 설치하지 않아도 로컬에서 설정이 가능하다!
    • 바인드 마운트와 함께 유용하게 사용하자.
728x90

'개발공부 개발새발 > Docker' 카테고리의 다른 글

Docker ) Docker-Compose  (0) 2024.04.03
Docker ) 다중 컨테이너  (0) 2024.04.02
Docker ) Network  (0) 2024.03.29
Docker ) ARG 와 ENV  (0) 2024.03.18
Docker ) 도커 볼륨과 바인드 마운트  (0) 2024.03.18