이미지 빌드: 수동 커밋에서 Dockerfile 혁명까지

발행: (2025년 12월 8일 오후 12:27 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

1. 수동 방식: docker commit 으로 이미지 만들기

A. docker commit 작동 원리

  1. 베이스 컨테이너 시작 – 인터랙티브 쉘 접근이 가능한 이미지 실행.

    docker run -it --name my_sandbox ubuntu:latest bash
  2. 수동으로 변경 – 컨테이너 안에서 소프트웨어를 설치하거나 설정, 예:

    apt-get update && apt-get install -y nginx
  3. 컨테이너 종료exit 입력으로 중지하되, 쓰기 가능한 레이어에 변경 사항을 보존.

  4. 변경 사항 커밋 – 현재 컨테이너 상태를 새로운 불변 이미지로 저장.

    docker commit  :

예시

docker commit my_sandbox my_custom_nginx:v1.0

B. 커밋된 이미지 업그레이드

이미지를 “업그레이드”하려면 과정을 반복합니다:

  1. my_custom_nginx:v1.0 로 새 컨테이너 시작.
  2. 추가 수동 변경 적용(예: Nginx 설정 업데이트).
  3. 컨테이너를 다시 커밋하고 새 이미지에 태그 지정.
docker commit  my_custom_nginx:v2.0

2. docker commit 의 한계

제한 사항설명영향
추적 불가컨테이너 내부에서 실행된 명령이 기록되지 않으며, 파일이 존재하는 이유나 패키지가 어떻게 설치됐는지 확인할 수 없음.감사, 디버깅, 보안 검증이 거의 불가능해짐.
재현 불가이미지를 삭제하면 정확히 같은 순서와 명령을 수동으로 다시 실행해야 함.환경 간 개발·배포 일관성 저하.
이미지 크기 증가docker commit 은 불필요한 파일(예: 임시 설치 캐시)까지 이미지 레이어에 포함시킴.풀링이 느려지고 디스크 사용량이 늘어남.
보안 위험이미지 레이어의 내용이나 히스토리를 쉽게 검증할 수 없음.숨겨진 취약점 위험 증가.

3. Dockerfile 혁명

Dockerfile 은 Docker가 순차적으로 실행해 이미지를 빌드하는 일련의 명령을 담은 평문 파일입니다.

왜 Dockerfile을 사용해야 할까?

  • 자동화 – 전체 빌드 과정이 완전 자동화됩니다.
  • 추적 가능 – 모든 명령이 명시적으로 기록돼 투명하고 감사 가능한 히스토리를 제공합니다.
  • 재현 가능 – Dockerfile만 있으면 누구든지 동일한 이미지를 일관되게 재생성할 수 있습니다.

Dockerfile 은 이미지의 소스 코드가 되어, 작고 안전하며 버전 관리가 가능한 베스트 프랙티스 빌드를 가능하게 합니다.

4. 필수 Dockerfile 명령어 (Part 1)

명령어목적레이어 생성?예시
FROM베이스 이미지 지정 (첫 번째 라인이어야 함).YesFROM node:18-alpine
RUN새로운 레이어에서 명령 실행(예: 패키지 설치).YesRUN apk add --no-cache git
WORKDIR이후 RUN, CMD, ENTRYPOINT, COPY, ADD 가 실행될 작업 디렉터리 설정.YesWORKDIR /app
COPY호스트의 파일/디렉터리를 이미지 파일 시스템에 복사.YesCOPY package.json /app
CMD컨테이너 실행 시 기본 명령 제공; 보통 시작 시 오버라이드됨. CMD는 하나만 허용.YesCMD ["node", "server.js"]
EXPOSE런타임에 컨테이너가 수신하는 포트를 문서화(실제 포트 매핑은 아님).NoEXPOSE 8080

CMDRUN 의 차이점

  • RUN – 이미지 빌드 단계에서 실행(예: 소프트웨어 설치).
  • CMD – 컨테이너 시작 시 실행(예: 애플리케이션 실행).

생략된 주제에 대한 간단 설명

네트워킹

EXPOSE 명령은 애플리케이션이 사용하는 포트를 문서화할 뿐입니다. 실제 포트 매핑(-p 8080:80 등)은 docker run 혹은 오케스트레이션 툴에서 수행되며 Dockerfile에서는 지정하지 않습니다.

볼륨

볼륨은 데이터 영속성을 담당하며 보통 docker run -v 혹은 Docker Compose 로 정의합니다. 선택적인 VOLUME 명령은 마운트 지점을 표시할 수 있지만, 이미지 외부에서 볼륨을 관리하는 것이 일반적으로 권장됩니다.

다음 단계는?

이제 Dockerfile 이 왜 필수인지 이해했습니다. Part 2에서는 docker build 로 전체 빌드 과정을 살펴보고, ENTRYPOINT 같은 고급 명령어, 멀티‑스테이지 빌드, 레지스트리에 이미지 배포하기 위한 베스트 프랙티스를 다룰 예정입니다.

Back to Blog

관련 글

더 보기 »

왜 GitFlow는 인프라에서 실패하는가

TL;DR GitFlow의 장기 운영 피처 또는 환경 브랜치를 Terraform에 적용하면 상태 드리프트와 취약한 파이프라인이 자주 발생합니다. 애플리케이션 코드와 달리 Infra...