Docker의 이미지는 계층 구조로 구성되며, 각 층은 이전 층을 기반으로 변경된 내용을 포함합니다. 컨테이너는 이러한 이미지 계층 위에 추가적인 저장 레이어를 통해 동작합니다. 데이터 볼륨을 사용하지 않는 경우, 컨테이너 내에서 수행된 파일 수정 사항은 모두 컨테이너의 저장 레이어에 기록됩니다.
일반적으로 새로운 이미지를 처음부터 만드는 경우는 드물며, 대부분은 기존의 기본 이미지(예: Ubuntu, CentOS 등)를 기반으로 새 이미지를 만들어냅니다. docker commit 명령어는 현재 실행 중인 컨테이너의 변경 사항을 기반으로 새로운 이미지를 생성하는 데 사용됩니다. 이는 기존 이미지의 기초 계층과 컨테이너의 변경 레이어를 결합하여 최종 상태를 반영한 새 이미지를 만드는 과정입니다. 간단히 말해, 이 명령어는 "이미지 버전 관리 시스템에 변경 사항을 커밋하는 것"과 같습니다.
그러나 실제 운영 환경에서는 docker commit보다는 Dockerfile을 활용한 이미지 생성을 권장합니다. 그 이유는 다음과 같습니다:
- 불필요한 파일이나 설정이 함께 포함되어 이미지 크기가 급격히 증가할 수 있으며, 정리가 누락되면 매우 무거운 이미지가 됩니다.
docker commit으로 생성된 이미지는 투명성이 부족한 '블랙박스' 형태이며, 제작자 외에는 어떤 변경이 있었는지 파악하기 어렵습니다.docker diff명령어만으로는 제한적인 정보만 제공됩니다.
예제 1: 컨테이너 상태를 이미지로 저장
# 기존 이미지 확인
docker images ubuntu
# 컨테이너 생성 및 실행
docker run --name test_container -d -it ubuntu bash
# 컨테이너 내부에서 파일 생성
docker exec -it test_container bash
echo "이것은 테스트 파일입니다." >> test_file.txt
exit
# 변경 사항 확인
docker diff test_container
# 컨테이너 상태를 기반으로 이미지 생성
docker commit --author "dev_user" --message "파일 추가" test_container myapp:version1
# 새로 생성된 이미지 확인
docker images | grep myapp
예제 2: 웹 서버 환경 구성 후 이미지 커밋
# Ubuntu 컨테이너 실행
docker run -i -t ubuntu /bin/bash
# 패키지 업데이트 및 Apache 설치
apt-get update && apt-get install -y apache2
# 종료 후 컨테이너 상태 커밋
exit
# 컨테이너 ID 확인
docker ps -a
# 컨테이너 상태를 기반으로 이미지 생성
docker commit <컨테이너_ID> webserver:apache2
# 생성된 이미지 확인
docker images | grep webserver
생성된 이미지는 이후 docker run 명령어로 직접 실행 가능하며, 설치된 애플리케이션과 설정이 유지됩니다. 그러나 장기적 관리 측면에서 Dockerfile을 사용하면 변경 내역이 명시적이며, 재현성과 유지보수성이 훨씬 뛰어납니다.