이미지를 받았는데 서비스가 실행되지 않는다면 다운로드가 실패한 것이 아닐 수 있다. Docker 이미지는 실행에 필요한 파일과 설정을 담은 묶음이고, 컨테이너는 그 이미지로 실제 실행한 인스턴스다. 이미지만 받아서는 프로세스가 시작되지 않는다.
이미지는 실행에 필요한 파일과 설정을 묶는다
Dockerfile은 기본 이미지, 복사할 파일, 실행 명령을 정의한다. 빌드하면 이미지가 만들어지고, 실행 명령을 내려야 컨테이너가 생긴다. 먼저 준비된 Ubuntu 이미지 하나로 이 차이를 확인해 보자.
docker image pull ubuntu:24.04
docker image ls ubuntu
docker container run --rm ubuntu:24.04 cat /etc/os-release
docker container ls -a
docker image ls ubunturun은 이미지로 컨테이너를 시작해 OS 정보를 출력한다. 이 명령은 작업이 끝나면 --rm으로 컨테이너를 지우지만 이미지는 남긴다. container ls -a에는 방금 종료한 컨테이너가 없어도 image ls ubuntu에는 받아 둔 이미지가 보이는 이유다. --rm을 빼고 다시 실행하면 이번에는 종료된 컨테이너가 목록에 남는 것도 비교할 수 있다.
컨테이너는 이미지에서 실행된다
컨테이너는 이미지 위에 쓰기 가능한 실행 계층을 더한다. 종료된 컨테이너와 삭제된 컨테이너는 다르다. --rm 없이 종료했다면 docker container ls -a에서 기록을 볼 수 있지만, 삭제된 컨테이너의 쓰기 계층은 데이터 보관 장소가 아니다. 데이터가 중요하면 볼륨이나 외부 저장소로 분리해야 컨테이너를 교체할 수 있다.
이미지가 보이는데 run이 실패하면 docker image ls만 반복하지 말고 오류가 이미지 취득, 실행 명령, 포트 충돌, 컨테이너 내부 프로세스 중 어디에서 나는지 나눈다. 오래 실행하는 컨테이너라면 docker container ls -a로 종료 여부를 보고 로그와 종료 코드를 확인한다. 일회성 명령처럼 즉시 끝나는 컨테이너가 목록에서 사라지는 것은 --rm을 쓴 결과일 수 있다.
운영에서는 latest처럼 바뀔 수 있는 태그만 믿지 말고 배포 이미지의 버전을 식별할 수 있게 관리한다. 이미지를 바꿔 새 컨테이너를 만드는 흐름과 데이터를 유지하는 흐름을 분리하고, 불필요한 파일이나 비밀값을 이미지에 넣지 않는 것이 기본이다.
핵심 요약
이미지는 실행 묶음이고 컨테이너는 그 이미지로 시작한 실행 인스턴스다. pull과 run을 구분하고, 종료와 삭제도 구분하자. 버전은 추적 가능하게 남기고 중요한 데이터는 컨테이너 밖에서 관리한다.

