관리 메뉴

코딩하는 락커

섹션 7: "유틸리티 컨테이너"로 작업하기 & 컨테이너에서 명령 실행하기 본문

🐳 도커와 쿠버네티스

섹션 7: "유틸리티 컨테이너"로 작업하기 & 컨테이너에서 명령 실행하기

락꿈사 2022. 8. 2. 17:22

모듈 소개 & "유틸리티 컨테이너"란 무엇인가?

  • 유틸리티 컨테이너: 특정 환경만 포함하는 컨테이너를 의미함
  • 유틸리티 컨테이너에서 환경을 시작할 때 애플리케이션을 시작하지 않음
  • 대신 특정 작업을 실행하기 위해 지정한 명령과 함께 실행함

 

 

유틸리티 컨테이너: 왜 사용하는가?

  • 많은 프로젝트와 많은 프로그래밍 언어는 프로젝트 초기 생성시 호스트 컴퓨터의 시스템에 설치할 부가적인 툴이 필요함
  • 이 부분을 유틸리티 컨테이너가 도와줄 수 있음

 

 

컨테이너에서 명령을 실행하는 다양한 방법

  • 빈 프로젝트 생성 후 터미널 입력
    • 도커 허브의 공식 node 이미지 실행
$ docker run node

  • 결과
    • 즉시 중지됨
    • 인터렉티브 모드에서 시작해야 하는 이미지이기 때문

  • 인터렉티브 모드로 재시작
    • 몇몇 기본 명령어 실행가능
    • 중요한 점은 노드 컨테이너를 이러한 방식으로 시작할 수 있다는 것임
$ docker run -it node

  • 인터렉티브 모드 + detached 모드로 재시작
    • 명령을 입력할 수는 없지만 내부적으로 컨테이너는 입력을 계속 기다리고 있으므로 컨테이너가 계속 실행됨
$ docker run -it -d node

  • 실행중인 컨테이너에 추가 명령어 실행
    • docker exec 실행중인_컨테이너_이름: 컨테이너가 실행하는 기본 명령 외에 실행 중인 컨테이너 내에서 특정 명령을 실행할 수 있음. 인터렉티브 모드에서 시작되어야만 함
    • 즉 애플리네이션은 계속 실행 중인 상태에서 컨테이너 내에 추가적인 명령을 실행할 수 있음
    • npm init: 노드 프로젝트 생성
    • 실행 후 설치할 패키지 이름을 입력하면 컨테이너 내부에 생성될 새로운 프로젝트의 설정을 입력할 수 있음
$ docker exec -it magical_chandrasekhar npm init

  • 디폴트 명령을 오버라이드 하여 실행
    • node 컨테이너를 시작할 때 컨테이너에서 실행되는 디폴트 명령은 node 실행 파일 그 자체이며, node 이미지가 실행되어 node 명령을 실행할 수 있는 인터렉티브 모드로 진입함
    • npm init을 지정하면 인터렉티브 입력 node 코드 모드를 진행하는 대신 npm init을 실행하게 됨
$ docker run -it node npm init

 

 

첫 번째 유틸리티 컨테이너 구축

  • dockerfile 작성
# 14-alpine 버전 사용 
# node 버전 14이지만 내부적으로 조금 더 슬림한 운영 체제인 alpine 버전을 사용함 
# 유틸리티 컨테이너를 만들기 위해서 더 슬림한 설정을 필요로 함
FROM node:14-alpine

# 작업 디렉토리 설정
# 이 컨테이너와 이 이미지에서 실행되는 명령에 의해 사용될 폴더 설정
WORKDIR /app

# CMD npm init 명령어를 작성하지 않도록 하여
# 사용자에게 이 이미지에 대한 모든 권한 부여
  • 노드 유틸리티임을 지정하여 빌드
    • -t node-util: 노드 유틸리티임을 의미하는 태그 지정
$ docker build -t node-util .

  • 빌드 완료 후 node-util 이미지에 "npm init" 명령어를 실행하고 미러링 하기
    • 미러링: 컨테이너에서 생성한 것들을 호스트 컴퓨터에서 사용하게 함. 즉 컨테이너로 호스트 컴퓨터에서 프로젝트 생성
    • 유틸리티 컨테이너를 사용하여 호스트 컴퓨터에 부가 도구를 설치하지 않고도 node 프로젝트를 실행할 수 있음
    • -it : 인터렉티브 모드에서 실행
    • -v {바인드_마운트_할_폴더의_위치}:{컨테이너_작업_디렉토리} : 폴더를 작업 디렉토리에 바인딩함
$ docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" node-util npm init

  • 결과
    • 컨테이너의 package.json이 호스트 컴퓨터 프로젝트에도 나타남

 

 

ENTRYPOINT 활용

  • Dockefile 수정
FROM node:14-alpine

WORKDIR /app

# CMD와의 차이점

# 아래 명령어로 실행한다고 했을 때 
# docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" node-util npm init

# CMD ["executalbe"] 작성시 실행되는 명령어
# docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" node-util "executable"
# 즉, docker run {이미지_이름} 뒤의 명령이 "executable"으로 덮어쓰여짐

# ENTRYPOINT ["executalbe"] 작성시 실행되는 명령어
# docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" node-util "executable" npm init
# 즉, docker run {이미지_이름} 뒤의 명령이 "executable" 뒤에 추가됨
ENTRYPOINT [ "npm" ]
  • -t mynpm 태그를 사용하여 태그
$ docker build -t mynpm .

  • 컨테이너 실행
    • 여기서 npm init 이 아니라 그냥 init으로 작성하는데 그 이유는 Dockerfile에서 ENTRYPOINT로 npm 을 이미 입력해줬기 때문에 작성할 필요가 없음
    • 모든 npm 명령어를 실행할 수 있음
$ docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" mynpm init
$ docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" mynpm install

  • 명시적 종속성 설치
    • express --save: 명시적 종속성 설치
    • --save: npm install 명령이 이 프로젝트에 대한 종속성으로 express 패키지를 추가하도록 허용하는 플래그
$ docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" mynpm install ex

 

Docker Compose 사용

  • docker-compose.yml 파일 작성
version: "3.8"
services:
  # 서비스명 지정
  npm:
    # 도커 파일 위치 지정
    # 즉, 이 컨테이너가 사용될 때 이 이미지를 빌드해야 함을
    # 컴포즈에게 알려줌
    build: ./
    # 입력이 필요한 명령의 경우 입력을 받게 함
    stdin_open: true
    tty: true
    # docker-compose.yml 파일이 있는 폴더를
    # 컨테이너 내부의 'app'폴더에 연결하여
    # 바인드 마운트 추가
    volumes:
      - ./:/app
  • docker compose로 실행
    • docker-compose up: docker-compose.yml 파일에 정의된 서비스를 불러오기 위한 명령어
    • docker-compuse run
      • yml 파일에 여러 서비스가 있는 경우에 단일 서비스로 실행할 수 있음
      • 서비스 이름으로 단일 서비스를 지정 가능
      • 여기서는 npm
    • 그 뒤에 도커 컴포즈에 의해 생성된 이미 실행중인 컨테이너에 ENTRYPOINT 다음 추가되어야 할 명령을 넣음
$ docker-compose run npm init

  • 컨테이너 종료시 자동으로 제거되도록 실행
    • -down: docker-compose up 명령시  컨테이너가 자동으로 제거되도록 함
    • 그러나 run 명령으로는 down 태그를 사용할 수 없음
    • --rm: docker-compose run 명령어 사용시 컨테이너가 자동으로 제거되도록 함
$ docker-compose run --rm npm init

Comments