이미지 빌드: 수동 커밋에서 Dockerfile 혁명까지
Source: Dev.to
1. 수동 방식: docker commit 으로 이미지 만들기
A. docker commit 작동 원리
-
베이스 컨테이너 시작 – 인터랙티브 쉘 접근이 가능한 이미지 실행.
docker run -it --name my_sandbox ubuntu:latest bash -
수동으로 변경 – 컨테이너 안에서 소프트웨어를 설치하거나 설정, 예:
apt-get update && apt-get install -y nginx -
컨테이너 종료 –
exit입력으로 중지하되, 쓰기 가능한 레이어에 변경 사항을 보존. -
변경 사항 커밋 – 현재 컨테이너 상태를 새로운 불변 이미지로 저장.
docker commit :
예시
docker commit my_sandbox my_custom_nginx:v1.0
B. 커밋된 이미지 업그레이드
이미지를 “업그레이드”하려면 과정을 반복합니다:
my_custom_nginx:v1.0로 새 컨테이너 시작.- 추가 수동 변경 적용(예: Nginx 설정 업데이트).
- 컨테이너를 다시 커밋하고 새 이미지에 태그 지정.
docker commit my_custom_nginx:v2.0
2. docker commit 의 한계
| 제한 사항 | 설명 | 영향 |
|---|---|---|
| 추적 불가 | 컨테이너 내부에서 실행된 명령이 기록되지 않으며, 파일이 존재하는 이유나 패키지가 어떻게 설치됐는지 확인할 수 없음. | 감사, 디버깅, 보안 검증이 거의 불가능해짐. |
| 재현 불가 | 이미지를 삭제하면 정확히 같은 순서와 명령을 수동으로 다시 실행해야 함. | 환경 간 개발·배포 일관성 저하. |
| 이미지 크기 증가 | docker commit 은 불필요한 파일(예: 임시 설치 캐시)까지 이미지 레이어에 포함시킴. | 풀링이 느려지고 디스크 사용량이 늘어남. |
| 보안 위험 | 이미지 레이어의 내용이나 히스토리를 쉽게 검증할 수 없음. | 숨겨진 취약점 위험 증가. |
3. Dockerfile 혁명
Dockerfile 은 Docker가 순차적으로 실행해 이미지를 빌드하는 일련의 명령을 담은 평문 파일입니다.
왜 Dockerfile을 사용해야 할까?
- 자동화 – 전체 빌드 과정이 완전 자동화됩니다.
- 추적 가능 – 모든 명령이 명시적으로 기록돼 투명하고 감사 가능한 히스토리를 제공합니다.
- 재현 가능 – Dockerfile만 있으면 누구든지 동일한 이미지를 일관되게 재생성할 수 있습니다.
Dockerfile 은 이미지의 소스 코드가 되어, 작고 안전하며 버전 관리가 가능한 베스트 프랙티스 빌드를 가능하게 합니다.
4. 필수 Dockerfile 명령어 (Part 1)
| 명령어 | 목적 | 레이어 생성? | 예시 |
|---|---|---|---|
FROM | 베이스 이미지 지정 (첫 번째 라인이어야 함). | Yes | FROM node:18-alpine |
RUN | 새로운 레이어에서 명령 실행(예: 패키지 설치). | Yes | RUN apk add --no-cache git |
WORKDIR | 이후 RUN, CMD, ENTRYPOINT, COPY, ADD 가 실행될 작업 디렉터리 설정. | Yes | WORKDIR /app |
COPY | 호스트의 파일/디렉터리를 이미지 파일 시스템에 복사. | Yes | COPY package.json /app |
CMD | 컨테이너 실행 시 기본 명령 제공; 보통 시작 시 오버라이드됨. CMD는 하나만 허용. | Yes | CMD ["node", "server.js"] |
EXPOSE | 런타임에 컨테이너가 수신하는 포트를 문서화(실제 포트 매핑은 아님). | No | EXPOSE 8080 |
CMD 와 RUN 의 차이점
RUN– 이미지 빌드 단계에서 실행(예: 소프트웨어 설치).CMD– 컨테이너 시작 시 실행(예: 애플리케이션 실행).
생략된 주제에 대한 간단 설명
네트워킹
EXPOSE 명령은 애플리케이션이 사용하는 포트를 문서화할 뿐입니다. 실제 포트 매핑(-p 8080:80 등)은 docker run 혹은 오케스트레이션 툴에서 수행되며 Dockerfile에서는 지정하지 않습니다.
볼륨
볼륨은 데이터 영속성을 담당하며 보통 docker run -v 혹은 Docker Compose 로 정의합니다. 선택적인 VOLUME 명령은 마운트 지점을 표시할 수 있지만, 이미지 외부에서 볼륨을 관리하는 것이 일반적으로 권장됩니다.
다음 단계는?
이제 Dockerfile 이 왜 필수인지 이해했습니다. Part 2에서는 docker build 로 전체 빌드 과정을 살펴보고, ENTRYPOINT 같은 고급 명령어, 멀티‑스테이지 빌드, 레지스트리에 이미지 배포하기 위한 베스트 프랙티스를 다룰 예정입니다.