섹션 7 - “유틸리티 컨테이너” & 명령 실행

1. 유틸리티 컨테이너란?

  • 정의:

    • 유틸리티 컨테이너는 일반 애플리케이션 컨테이너처럼 코드와 서버 환경을 항상 실행하는 대신, 특정 작업(예: npm init이나 npm install 같은 명령)을 빠르게 실행하기 위해 만들어진 컨테이너입니다.

  • 특징:

    • 특정 작업 전용: 애플리케이션 코드 대신 개발 도구나 환경(NodeJS, PHP 등)만 포함합니다.

    • 일회성 실행: 명령 실행 후 바로 종료되거나, 필요할 때마다 반복해서 사용할 수 있습니다.

    • 호스트 환경 보호: 호스트 컴퓨터에 따로 Node나 npm을 설치하지 않아도 작업을 수행할 수 있습니다.


2. 유틸리티 컨테이너가 필요한 이유

  • 개발 환경 경량화:

    • 보통 Node 프로젝트를 만들 때는 npm init을 실행하기 위해 컴퓨터에 NodeJS가 있어야 합니다.

    • 유틸리티 컨테이너를 사용하면, 필요한 도구들이 컨테이너 안에 이미 포함되어 있어 호스트에 설치할 필요가 없습니다.

  • 복잡한 설정 해결:

    • PHP/Laravel처럼 여러 도구와 복잡한 설정이 필요한 경우, 컨테이너로 필요한 최소한의 환경만 제공하면 관리하기 쉽습니다.

  • 바인드 마운트 활용:

    • 컨테이너를 실행할 때 로컬 디렉토리(소스 코드 폴더)를 컨테이너 내부의 작업 폴더와 연결하면, 컨테이너에서 생성된 파일이나 변경 사항이 바로 호스트에 반영됩니다.


3. 유틸리티 컨테이너 사용 시 고려사항

3.1 명령 전달 방식

  • docker run 방식:

    • 이미지 이름 뒤에 실행할 명령(예: npm init)을 입력하면, 컨테이너가 그 명령을 실행한 후 종료됩니다.

    • 예시:

  • docker exec 방식:

    • 이미 실행 중인 컨테이너에 접속해 추가 명령(예: 로그 확인, 다른 작업)을 실행할 때 사용합니다.

3.2 ENTRYPOINT와 CMD

  • CMD:

    • 기본 실행 명령을 지정하지만, docker run 시 새 명령어가 제공되면 그 명령어로 바뀝니다.

  • ENTRYPOINT:

    • 기본 명령을 지정하고, docker run 시 추가되는 인자들이 기본 명령 뒤에 붙습니다.

    • 예를 들어, Dockerfile에 ENTRYPOINT ["npm"]로 설정해두면 docker run … init 명령을 실행할 때 내부적으로 npm init으로 실행됩니다.

3.3 Linux 환경에서 파일 권한 이슈

  • 문제:

    • Linux에서는 Docker가 기본적으로 root로 실행되므로, 컨테이너에서 생성된 파일이 모두 root 소유로 만들어질 수 있습니다.

  • 해결 방안:

    • 방법 1: 공식 Node 이미지에서 제공하는 node 사용자(보통 UID 1000)를 사용하도록 Dockerfile에 USER node를 추가합니다.

    • 방법 2: Dockerfile에서 기본 node 사용자를 삭제한 후, 빌드 시 호스트의 UID/GID에 맞게 새 사용자를 생성하는 방법을 사용할 수 있습니다.


4. Docker Compose를 통한 유틸리티 컨테이너 활용

  • Docker Compose 사용 이유:

    • 매번 긴 명령을 입력하지 않고, 미리 구성된 docker-compose.yml 파일로 환경 설정(바인드 마운트, tty/interactive 옵션, 환경 변수 등)을 관리할 수 있습니다.

    • 유틸리티 컨테이너 한 개라도 Docker Compose로 설정하면 일관된 환경에서 쉽게 사용할 수 있습니다.

  • 예시 구성:

    • 아래는 package.json 파일을 생성하는 유틸리티 컨테이너 예시입니다.

    • 그런 후, 다음 명령을 입력하면 ENTRYPOINT에 설정된 npm 명령과 함께 init이 실행됩니다.

    • 작업이 끝나면 컨테이너는 자동으로 제거됩니다. (--rm에 의해)

    • run 명령어는 특정 service를 실행하기 위함입니다.

    • 위 코드에서의 npm은 service 이름입니다.


5. 전체 활용 예

  • 초기 프로젝트 생성:

    • 호스트에 NodeJS나 PHP를 설치하지 않고도, 유틸리티 컨테이너로 npm init 혹은 Laravel 초기화를 실행할 수 있습니다.

    • 바인드 마운트를 사용해 생성된 파일이 바로 로컬 폴더에 반영되어 후속 작업(예: 의존성 설치)이 가능해집니다.

  • 명령 실행의 유연성:

    • docker run이나 docker exec 명령을 사용해 컨테이너 내부에서 인터랙티브하게 작업할 수 있습니다.

    • ENTRYPOINT 설정을 통해 기본 명령을 쉽게 오버라이드할 수 있으므로, 다양한 작업을 한 이미지로 처리할 수 있습니다.

  • 보안 및 권한 관리:

    • Linux에서 발생할 수 있는 파일 권한 문제는 위의 두 가지 해결 방법을 통해 처리할 수 있습니다.

  • Docker Compose의 장점:

    • 복잡한 명령어를 매번 타이핑할 필요 없이, 하나의 설정 파일로 여러 작업을 손쉽게 관리하고 실행할 수 있습니다.


결론

유틸리티 컨테이너는

  • 애플리케이션 컨테이너와 달리 특정 작업(예: 프로젝트 초기화, 의존성 설치 등)에 집중하는 작은 도구입니다.

  • 호스트에 복잡한 도구들을 설치할 필요 없이, 컨테이너 내부에서 모든 작업을 처리할 수 있게 해줍니다.

  • 또한 Docker의 다양한 기능(ENTRYPOINT, docker run/exec, Docker Compose 등)을 활용해, 개발 환경을 쉽게 만들고 관리할 수 있는 강력한 도구입니다.

Last updated