[Infra][Docker] 도커 이미지 이해하기🖥️ Dev/Infra2025. 7. 20. 17:49
Table of Contents
이 글은 도커 이미지에 대해 정리한 글입니다.
📚 도커 이미지의 개념과 역할
- 도커 이미지(image)란, 컨테이너 실행에 필요한 모든 파일, 라이브러리, 설정 등을 하나의 패키지로 묶어놓은 읽기 전용(immutable) 파일 시스템의 스냅샷이다.
- 이미지는 컨테이너(container)가 실행될 때 그 기반이 된다. 즉, 이미지는 "설치 CD", 컨테이너는 "실행 중인 컴퓨터"에 비유할 수 있다.
- 도커 이미지는 변경이 불가능하고 읽기 전용이기 때문에, 안정적으로 여러 환경에 동일하게 배포할 수 있다는 큰 장점이 있다.
- 실제로 컨테이너를 만든다고 하면, "이미지를 복사해서 읽기/쓰기가 가능한 레이어를 하나 얹고, 그 위에서 실행"하는 구조이다.
📖 도커 이미지의 구조와 레이어

- 도커 이미지는 여러 개의 레이어(layer)로 구성된다.
- 각 레이어는 파일 시스템의 "변경 이력" 또는 "차이(diff)"만을 담고 있다.
- ex) Ubuntu 이미지를 만든 후, 여기에 NGINX를 설치하면 NGINX 설치 내용만을 새로운 레이어로 쌓는다.
- 레이어는 계층 구조로 쌓이며, 하위 레이어의 내용을 상속받아 최종 이미지가 완성된다.
- 각 레이어는 고유한 해시 값(sha265:<hash>)으로 구분되며, 도커는 레이어 단위로 이미지를 관리한다.
- 레이어는 내부적으로 Layer ID 또는 Layer Hash로 구분한다. 사용자가 직접 레이어를 신경 쓸 일은 거의 없으며, 도커가 투명하게 관리한다.
- 이미 다운로드한 레이어는 중복 다운로드하지 않고 캐시를 사용해 효율적으로 저장공간을 관리하여 이미지 전체 크기를 최소화할 수 있다.
⚙️ 도커 이미지 다운로드와 동작 원리
➡️ 도커 이미지는 도커 엔진이 설치된 호스트의 /var/lib/docker 디렉터리에 저장된다.
- 이미지 검색 및 선택
- docker image pull <Image[:tag]> 명령어 사용
- Docker Hub (공식 저장소) 또는 프라이빗 레지스트리에서 이미지를 검색해 선택한다.
- 이미지 레이어 다운로드
- 도커 이미지는 여러 레이어로 쌓여 있다.
- 도커가 이미 가지고 있는(캐시된) 레이어는 중복 다운로드하지 않는다.
- 레이어 병합
- 각 레이어를 조합해 하나의 최종 이미지로 만든다.
- 이 이미지 자체는 변경이 불가능하다.
- 이미지 생성 및 태깅(Tagging)
- 이미지를 내려받거나 새로 만들면, 태그(tag)를 붙여 버전 관리를 할 수 있다.
- docker image tag <원본이미지:태그> <새로운이미지:새태그>
🛠️ 도커 환경 변수(Environment Variable) 활용
➡️ 도커 이미지는 다양한 환경(개발, 테스트, 운영 등)에서 재사용된다. 이때 환경 변수를 이용하면 동일한 이미지를 다양한 환경에 맞게 동적으로 설정할 수 있다.
📌 도커 환경 변수 사용 목적
- 설정값 전달
- DB 주소, API 키, 포트번호 등 실행환경별로 달라질 수 있는 값을 전달
- 보안성 강화
- 민감한 정보(비밀번호 등)를 코드에 직접 쓰지 않고 환경 변수로 사용
- 환경별 설정
- 개발/운영 환경별로 환경 변수만 다르게 주면, 이미지는 그대로 사용 가능
📌 환경 변수 전달 방법
⚡ 도커 파일(Dockerfile) 내부에서 ENV 사용
ENV API_KEY=abcdef12345
- 이미지를 빌드할 때 변수 값이 고정된다.
- 컨테이너에서 해당 환경변수로 접근할 수 있다.
⚡ 컨테이너 실행 시 -e 옵션 사용
docker run -e DB_PASSWORD=secretpw mysql:latest
- 컨테이너 시작 시 변수 값을 주입힌다.
- 코드에는 변수명이 그대로 있고, 실제 값은 외부에서 전달된다.
⚡ 도커 컴포즈(docker-compose.yaml)에서 environment 사용
services:
myapp:
image: myapp:latest
environment:
- APP_ENV=production
- API_KEY=${API_KEY}
- 여러 컨테이너의 환경 변수도 일괄 관리 가능
- .env 파일과 연동 가능
🎯 도커 이미지의 커맨드와 엔트리포인트
📌 CMD와 ENTRYPOINT의 역할
➡️ 보통 ENTRYPOINT로 컨테이너의 메인 프로세스를 지정하고, CMD로는 옵션이나 파라미터를 지정한다.
- 컨테이너가 시작될 때 실행할 명령을 지정한다.
- CMD는 실행 시 덮어쓸 수 있는 기본 명령, ENTRYPOINT는 반드시 실행되는 명령이라는 점에서 차이가 있다.
⚡ CMD
- 도커 파일에 CMD로 정의한다.
- 컨테이너를 docker run으로 실행할 때, 커맨드라인 인수로 덮어쓸 수 있다.
⚡ ENTRYPOINT
- 도커 파일에 ENTRYPOINT로 정의한다.
- 컨테이너가 시작될 떄 항상 실행되는 명령이다.
- CMD와 함께 쓰면 CMD가 ENTRYPOINT의 인수가 된다.
'🖥️ Dev > Infra' 카테고리의 다른 글
| [Infra][Docker][Error] docker: Error response from daemon: unauthorized (0) | 2026.02.08 |
|---|---|
| [Infra][Docker] 도커 네트워크로 백엔드와 DB 연동해서 배포하기 (0) | 2026.02.04 |
| [Infra][Server] 포트포워딩 없이 외부에서 내 서버로! 연결 확인 및 첫 웹 서버 배포 (with. Tailscale) (0) | 2026.01.26 |
| [Infra][SSH] 이중 NAT 환경에서 포트포워딩 없이 외부에서 라즈베리파이 접속하기 (with. Tailscale) (0) | 2026.01.23 |
| [Infra][Docker] 도커 기본 명령어 모음 (0) | 2025.07.20 |
@청월누리 :: DevKuk 개발 블로그
since 2025.01.27. ~ 개발자를 향해....🔥