Docker 이미지는 컨테이너를 생성하기 위한 읽기 전용 템플릿(실행파일)이고, Docker 컨테이너는 이미지를 기반으로 생성된 실행 가능한 인스턴스입니다.
이미지에는 애플리케이션 코드와 런타임, 라이브러리, 환경 설정, 기본 실행 명령 등 컨테이너 실행에 필요한 내용이 포함됩니다. 일반적으로 Dockerfile의 명령을 통해 여러 읽기 전용 레이어로 빌드되며, 레지스트리에 저장하거나 다른 환경으로 전달할 수 있습니다. 이미지를 변경해야 한다면 기존 이미지를 직접 수정하는 대신 새로운 레이어를 가진 이미지를 다시 생성합니다.
컨테이너를 생성하면 이미지의 읽기 전용 레이어 위에 컨테이너별 쓰기 가능한 레이어가 추가됩니다. 실행 중 생성하거나 변경한 파일은 이 레이어에 기록되므로, 같은 이미지로 여러 컨테이너를 실행하더라도 각각 독립적인 상태를 가질 수 있습니다. 컨테이너를 삭제하면 이 쓰기 레이어의 데이터도 사라지기 때문에 보존해야 하는 데이터는 볼륨에 저장해야 합니다.
예를 들어 docker build로 애플리케이션 이미지를 한 번 만들고, docker run으로 그 이미지에서 여러 컨테이너를 생성할 수 있습니다. 이미지가 실행 환경의 설계도라면 컨테이너는 그 설계도로 만들어 실제로 실행 중이거나 실행할 수 있는 객체라고 볼 수 있습니다.
정리하면 이미지는 재사용하고 배포하는 불변의 패키지이며, 컨테이너는 이미지에 실행 설정과 쓰기 가능한 상태가 더해진 실행 단위입니다. 컨테이너 내부가 변경되어도 기반 이미지는 변경되지 않습니다.
Docker 이미지가 레이어 구조를 사용하는 이유는 무엇인가요?
변경되지 않은 레이어를 여러 이미지와 컨테이너가 공유하고 빌드 캐시로 재사용할 수 있어 저장 공간과 전송량, 빌드 시간을 줄일 수 있습니다. Dockerfile의 앞쪽 레이어가 변경되면 그 뒤 레이어의 캐시도 무효화될 수 있으므로 명령 순서도 중요합니다.
컨테이너 내부에서 수정한 파일은 이미지에도 반영되나요?
아닙니다. 변경 내용은 이미지 위에 추가된 해당 컨테이너의 쓰기 가능 레이어에만 저장되며 기반 이미지는 그대로 유지됩니다. 동일한 변경을 재현해야 한다면 Dockerfile을 수정하여 새 이미지를 빌드해야 합니다.
하나의 이미지로 여러 컨테이너를 실행하면 상태도 공유되나요?
읽기 전용 이미지 레이어는 공유하지만 각 컨테이너는 별도의 쓰기 가능 레이어와 프로세스, 실행 설정을 가지므로 상태는 기본적으로 독립적입니다. 데이터를 공유해야 한다면 공용 Volume이나 외부 데이터 저장소를 사용해야 합니다.