핵심 요약
- 이미지(image)는 애플리케이션 실행에 필요한 것을 담은 읽기 전용 템플릿(설계도)입니다.
- 컨테이너(container)는 그 이미지를 실행한 인스턴스로, 격리된 상태로 실제 돌아가는 프로세스입니다.
- 같은 이미지 하나로 컨테이너를 여러 개 띄울 수 있습니다. (클래스와 인스턴스 관계)
- 볼륨(volume)은 컨테이너와 분리된 데이터 저장소입니다. 컨테이너를 지워도 데이터를 남기려면 볼륨에 저장해야 합니다.
Docker를 처음 배우면 이미지·컨테이너·볼륨이라는 세 단어가 계속 뒤섞여 헷갈립니다. 특히 “이미지랑 컨테이너가 뭐가 다르지?”, “컨테이너를 지웠는데 왜 DB 데이터가 사라졌지?” 같은 질문에서 막히기 쉽습니다. 이 셋의 관계만 한 번 제대로 잡으면 Docker의 나머지 개념은 훨씬 쉽게 따라옵니다. 이 글에서는 세 개념의 차이를 비유와 그림, 기본 명령어로 정리합니다.
이미지: 실행에 필요한 것을 담은 설계도
이미지는 애플리케이션 코드, 런타임(예: Node.js·Python), 라이브러리, 설정을 하나로 묶은 읽기 전용 패키지입니다. 한 번 만들어지면 내용이 바뀌지 않고(불변), 여러 층(layer)이 쌓인 형태로 저장됩니다. 흔히 설계도나 붕어빵 틀에 비유합니다. 설계도 자체는 실행되지 않고, 실행할 대상을 정의할 뿐입니다.
컨테이너: 이미지를 실행한 인스턴스
컨테이너는 이미지를 docker run으로 실행했을 때 생기는 실제로 돌아가는 인스턴스입니다. 설계도(이미지)로 지은 건물, 붕어빵 틀로 찍어낸 붕어빵에 해당합니다. 컨테이너는 호스트 OS 위에서 격리된 프로세스로 동작하며, 자체적인 파일시스템·네트워크를 가진 것처럼 보이지만 실제로는 가볍게 격리된 하나의 프로세스입니다. 그래서 가상머신보다 훨씬 빠르게 뜨고 가볍습니다.
이미지 vs 컨테이너 한눈에
| 구분 | 이미지 | 컨테이너 |
|---|---|---|
| 정체 | 설계도(읽기 전용 템플릿) | 설계도로 실행한 인스턴스 |
| 상태 | 변하지 않음(불변) | 실행·중지·삭제되는 일회성 |
| 개수 | 1개 | 같은 이미지로 여러 개 가능 |
| 비유 | 붕어빵 틀 / 클래스 | 붕어빵 / 인스턴스 |
볼륨: 컨테이너가 사라져도 남는 데이터
컨테이너는 기본적으로 일회성입니다. 컨테이너 안에서 만든 파일은 그 컨테이너를 삭제하면 함께 사라집니다. 그런데 데이터베이스나 업로드된 파일처럼 보존돼야 하는 데이터를 컨테이너 안에만 두면, 컨테이너를 재생성하는 순간 데이터가 통째로 날아갑니다. 이를 막기 위해 볼륨을 사용합니다.
볼륨은 컨테이너의 생명주기와 분리된 저장 공간입니다. 컨테이너를 지웠다 다시 만들어도 볼륨에 담긴 데이터는 그대로 유지됩니다. “컨테이너는 언제든 버릴 수 있게(stateless), 데이터는 볼륨에 따로(stateful)”가 컨테이너 운영의 기본 원칙입니다. 참고로 볼륨과 비슷하게 호스트의 특정 폴더를 직접 연결하는 바인드 마운트도 있는데, 개발 환경에서 소스 코드를 실시간 반영할 때 자주 씁니다.
기본 명령어로 흐름 익히기
# 이미지 내려받기
docker pull nginx
# 이미지로 컨테이너 실행 (백그라운드, 포트 연결)
docker run -d -p 8080:80 --name web nginx
# 실행 중인 컨테이너 확인
docker ps
# 볼륨을 만들어 컨테이너에 연결 (데이터 보존)
docker volume create mydata
docker run -d -v mydata:/var/lib/mysql --name db mysql
# 컨테이너 중지·삭제 (이미지는 그대로 남음)
docker stop web && docker rm web
docker rm으로 컨테이너를 지워도 docker images에는 이미지가 그대로 남아 있고, mydata 볼륨의 데이터도 유지됩니다. 이 점을 눈으로 확인해 보면 세 개념의 관계가 확실히 잡힙니다.
헷갈릴 때 잡아주는 관점 (신입)
세 개념을 한 문장으로 꿰면 이렇습니다. “바뀌지 않는 이미지로 → 일회용 컨테이너를 찍어내고 → 지켜야 할 데이터는 볼륨에 밖으로 빼둔다.” 처음 배포를 해보면 대개 “컨테이너를 다시 올렸더니 데이터가 초기화됐다”는 지점에서 볼륨의 필요성을 몸으로 깨닫게 됩니다. 신입 면접에서도 “이미지와 컨테이너의 차이”, “컨테이너의 데이터는 어떻게 보존하나요?”는 단골 질문이라, 이 세 관계를 명령어와 함께 설명할 수 있으면 충분합니다.
자주 묻는 질문 (FAQ)
Q. 하나의 이미지로 컨테이너를 여러 개 만들 수 있나요?
네. 같은 이미지에서 컨테이너를 얼마든지 실행할 수 있고, 각 컨테이너는 서로 독립적으로 동작합니다. 로드밸런싱으로 같은 앱을 여러 대 띄우는 것도 이 원리입니다.
Q. 컨테이너를 지우면 이미지도 사라지나요?
아니요. docker rm은 컨테이너만 삭제하고 이미지는 남습니다. 이미지를 지우려면 docker rmi를 따로 실행해야 합니다.
Q. 볼륨과 바인드 마운트는 무엇이 다른가요?
볼륨은 Docker가 관리하는 저장 공간이고, 바인드 마운트는 호스트의 특정 경로를 직접 연결합니다. 운영 데이터는 볼륨, 개발 중 소스 코드 실시간 반영은 바인드 마운트가 일반적입니다.
마무리
이미지는 설계도, 컨테이너는 그 설계도로 실행한 일회용 인스턴스, 볼륨은 컨테이너 밖에 데이터를 보존하는 저장소 — 이 세 관계가 Docker의 뼈대입니다. 여기까지 잡히면 Dockerfile 작성, 이미지 최적화, Docker Compose로 여러 컨테이너를 묶는 다음 단계로 자연스럽게 넘어갈 수 있습니다.
더 읽어보기
- 신입 인프라 엔지니어 공부 순서: 리눅스·네트워크·도커·클라우드 로드맵
- Nginx 리버스 프록시란? 웹서버와 애플리케이션 서버를 연결하는 원리
- 리눅스 systemd란? 서비스를 등록하고 자동 실행하는 방법
이 글은 학습·정보 제공을 목적으로 작성되었습니다. 실제 환경과 Docker 버전에 따라 명령어 옵션은 달라질 수 있습니다.