섹션 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