Docker Image란 무엇인가요?
Docker에서 이미지(Image)란 컨테이너를 만들기 위한 실행 환경을 패키징 한 파일이에요.
- 도커 이미지(docker image) = 실행 환경 + 애플리케이션 + 설정이 담긴 설계도
- 이 이미지를 기반으로 만들어지는 것이 컨테이너예요.
예를 들어 nginx 웹 서버를 실행하고 싶다면? nginx 이미지만 있으면 바로 컨테이너로 실행할 수 있어요. 설치 과정이 필요 없습니다.
☁️ Docker Hub란?
Docker Hub는 Docker 공식 이미지 저장소로, 전 세계 개발자들이 이미지를 공유하고 다운 로드할 수 있는 공개 클라우드 레지스트리입니다.
- 주소: https://hub.docker.com/
- 수많은 공식 이미지 및 커뮤니티 이미지가 올라와 있어요.
- 누구나 계정을 만들어 이미지를 업로드하거나 공유할 수 있어요.
흔히 사용하는 docker pull ubuntu, docker pull nginx 같은 명령어는 Docker Hub에서 이미지를 가져오는 동작이에요.
Docker Hub의 역할은 GitHub의 코드 저장소와 비슷하게, 이미지를 업로드하고 내려받을 수 있는 중앙 저장소라고 보면 됩니다.
💡 Docker Hub에서도 Private Repository를 만들 수 있어, 외부에 노출되지 않는 비공개 이미지 저장도 가능합니다.
💡 Docker 이미지는 꼭 Docker Hub에만 저장해야 하는 것은 아니에요. 기업이나 팀에서는 보안, 속도, 내부 정책 문제로 인해
다양한 컨테이너 이미지 레지스트리(Container Regsitry)를 사용하기도 합니다. (Google Artifact Registry(GCP), GitHub Container Registry, Amazon ECR 등)
Docker Image 관련 명령어
📌 이미지 검색
Docker Hub에서 제공하는 공식 이미지를 검색하는 명령어예요. (Docker Hub 사이트에서도 확인할 수 있어요)
docker search [이미지이름]
예시:
docker search nginx
예시 출력:
- NAME: 이미지 이름
- DESCRIPTION: 설명
- STARS: 좋아요 수 (커뮤니티 신뢰도)
- OFFICIAL: 공식 인증 여부
📌 이미지 다운로드 (pull)
docker pull [이미지이름[:태그]]
예시:
docker pull ubuntu:22.04
docker pull node:18-alpine
docker pull redis:latest
docker pull nginx
- :태그를 생략하면 기본값이 latest가 자동으로 붙어요.(최신 버전)
- 명확한 환경 재현을 위해선 버전을 지정하는 것이 좋아요 (ubuntu:22.04)
📌 현재 로컬에 있는 이미지 목록 확인
docker images
예시 출력:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 22.04 d80997daaa38 3 weeks ago 106MB
mariadb 11.4.5 49117dcc565c 4 months ago 577MB
- REPOSITORY + TAG = 이미지의 이름과 버전
- IMAGE ID: 내부에서 사용하는 해시값 ID
- SIZE: 디스크에서 차지하는 용량
📌 Docker 이미지는 어디에 저장되나요?
Docker 이미지는 기본적으로 호스트 시스템의 Docker 저장소 디렉터리에 저장돼요. 운영체제마다 경로가 다를 수 있지만 일반적으로:
- Linux: /var/lib/docker
- macOS (Docker Desktop): 내부적으로 가상 머신에 저장됨 (직접 접근 어려움)
- Windows (Docker Desktop): WSL2 경로 또는 C:\ProgramData\DockerDesktop
Docker는 이미지, 컨테이너, 볼륨, 레이어 등을 이 디렉토리 하위에서 자체적으로 관리해요. 직접 접근보다는 Docker CLI 명령어로 관리하는 것이 일반적입니다.
📌 이미지 삭제하기
docker rmi [이미지이름:태그 또는 IMAGE ID]
예시:
docker rmi ubuntu:22.04
docker rmi d80997daaa38
- 컨테이너가 해당 이미지를 사용 중이면 삭제되지 않아요.
- 하지만 -f 옵션으로 강제 삭제 가능합니다.
📌 컨테이선를 생성하려는데 이미지가 없는 경우?
컨테이너를 생성(docker run) 하기 위해선 생성하기 위한 이미지가 존재해야 합니다.
docker run ubuntu:22.04
만약 이 명령어를 실행했을 때, 로컬에 이미지가 존재하지 않는 경우 Docker는 자동으로 Docker Hub에서 이미지를 다운로드(pull) 해온 후, 컨테이너를 생성해요.
이미지 구조를 확인하는 명령어들
Docker 이미지는 단순히 "이름만 있는 실행 단위"가 아니에요. 그 내부 구조를 확인하고 분석하면, 이미지 최적화나 보안 점검에도 도움이 됩니다.
📌 docker image inspect: 이미지 상세 정보 조회
docker image inspect [OPTIONS] IMAGE [IMAGE...]
- 출력은 JSON 형식으로 제공됩니다.
- 특정 이미지가 어떤 OS 위에서, 어떤 명령으로, 어떤 환경 변수로 실행되는지를 파악할 수 있어요.
- 파일 시스템 경로, 포트 설정, 환경 변수, 엔트리 포인트, 커맨드 등의 정보도 확인할 수 있어요.
💡 | jq를 붙이면 JSON을 보기 쉽게 출력할 수 있어요.
📌 docker image history: 이미지의 생성 과정 조회
docker image history [OPTIONS] IMAGE
- 이 명령어는 이미지가 어떻게 만들어졌는지를 레이어(계층)별로 시각화해서 보여줘요.
- 각 레이어가 어떤 Dockerfile 명령에 의해 생성됐는지를 시간 순서대로 확인할 수 있어요.
- 이미지가 비효율적으로 만들어졌는지 판단할 때 유용합니다.
출력 예시:
IMAGE CREATED CREATED BY SIZE COMMENT
65f4eb810dfa 4 days ago CMD ["java" "-jar" "app.jar"] 0B buildkit.dockerfile.v0
<missing> 4 days ago COPY build/libs/OrderService.jar /app/app.ja… 85.2MB buildkit.dockerfile.v0
<missing> 11 days ago WORKDIR /app 8.19kB buildkit.dockerfile.v0
<missing> 11 days ago RUN /bin/sh -c apt-get update && apt-get… 731MB buildkit.dockerfile.v0
<missing> 11 days ago LABEL authors=dongmin 0B buildkit.dockerfile.v0
<missing> 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:f7fa9c3fec404bf05… 79MB
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 2 months ago /bin/sh -c #(nop) ARG LAUNCHPAD_BUILD_ARCH 0B
<missing> 2 months ago /bin/sh -c #(nop) ARG RELEASE 0B
이미지의 계층 구조란?
이미지의 계층 구조를 이해하려면 Dockerfile이라는 개념을 잠깐 짚고 넘어가야 해요.
Dockerfile은 Docker 이미지를 만들기 위한 설계도 같은 파일이에요. FROM, RUN, COPY 같은 명령어들을 차곡차곡 쌓아 올리며 하나의 이미지를 만들어내요. 각 명령어는 이미지 안에 레이어(Layer)를 하나씩 생성하는데, 이 구조 덕분에 Docker 이미지는 효율적인 캐싱과 중복 제거가 가능해지는 거예요.
💡 Dockerfile에 대한 내용은 다음에 자세히 다룰 예정이에요. 여기서는 이미지가 어떻게 계층적으로 구성되는지를 중점적으로 살펴보겠습니다.
🔸 레이어는 어떻게 구성되나요?
- 각 Dockerfile의 명령은 하나의 레이어를 만듭니다.
- 아래에서부터 위로 쌓이며, 위에 있는 레이어가 아래 레이어를 덮는 방식(Overlay FS)
- 최종적으로 여러 레이어가 합쳐져 하나의 이미지로 인식됩니다.
🔸 레이어로 다운받는 계층 구조의 장점
docker image pull를 실행하면 다음과 같은 메시지가 보입니다:
Pulling from library/nginx
5eb5b503b376: Pull complete
61ab9d3d889c: Pull complete
...
Docker는 이미지의 각 레이어를 별도로 저장하고 관리해요. 이미 다운로드된 레이어는 재사용합니다.
예를 들어 동일한 베이스 이미지를 공유하는 경우, 해당 베이스 이미지가 이미 캐시 되어 있다면, 그 레이어는 다시 받지 않고 재사용합니다.
- 중복 제거: 같은 레이어를 여러 이미지에서 공유 가능
- 캐시 활용: 이미지 빌드 속도 향상, 다운로드 최적화
- 버전 추천: docker image history 이미지가 어떻게 변화해왔는지 확인 가능
→ 이 계층 구조 덕분에 Docker는 빠른 실행과 효율적인 저장소 사용이 가능해집니다.