[Container] Docker: image, layer, registry
Docker, Dockerfile, OCI image, image layer, registry, docker compose, BuildKit
정의
Docker = 컨테이너 빌드 + 실행 + 배포 의 표준 도구. 2013 출시 → 컨테이너 시대 의 시작. 현재는 OCI 표준 으로 진화 (containerd, runc, podman 등 호환).
Layered Filesystem
flowchart TB
Base["base: ubuntu:24.04"]
Base --> L1["L1: apt install nginx"]
L1 --> L2["L2: COPY config /etc/nginx/"]
L2 --> L3["L3: COPY app /var/www/"]
L3 --> Image[Final Image]
Image --> RW["R/W layer (container 실행 시)"]
각 Dockerfile instruction = 별도 layer. 불변 + 재사용 (cache).
Dockerfile
# 멀티 스테이지 빌드
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine AS runtime
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
| instruction | 의미 |
|---|---|
FROM | base image |
WORKDIR | 작업 디렉토리 |
COPY / ADD | 파일 복사 |
RUN | 빌드 시 실행 |
CMD / ENTRYPOINT | 컨테이너 시작 명령 |
EXPOSE | 포트 (문서화, 자동 노출 아님) |
ENV | 환경 변수 |
ARG | 빌드 시 변수 |
VOLUME | mount point |
USER | 실행 사용자 |
HEALTHCHECK | health probe |
멀티 스테이지 빌드
flowchart LR
Stage1["Stage 1: builder<br/>(큰 dependency)"] -->|결과물만 복사| Stage2["Stage 2: runtime<br/>(작은 base)"]
빌드 도구는 final image 에 안 들어감. 최종 image 가 작고 안전.
Image Registry
| Registry | 특징 |
|---|---|
| Docker Hub | 공식, rate limit |
| GHCR (GitHub) | github 통합 |
| ECR (AWS) | IAM 통합 |
| Artifact Registry (GCP) | GCP 통합 |
| Harbor | self-host |
Build vs Buildx (BuildKit)
# 옛 docker build
docker build -t myapp .
# Buildx (멀티 아키 + 캐시 + 병렬)
docker buildx build --platform linux/amd64,linux/arm64 -t myapp --push .
BuildKit 가 2026 표준. ARM/x86 멀티 아키 동시 build + 효율적 cache.
.dockerignore
node_modules
.git
.env
**/*.log
dist
.gitignore 같은. build context 작게 → 빠른 build.
Layer Cache 활용
# ❌ 의존성과 코드 같이 복사 → 코드 변경 시 npm ci 재실행
COPY . .
RUN npm ci
# ✅ 의존성 먼저
COPY package*.json ./
RUN npm ci
COPY . .
흔한 함정
WARNING
latesttag = build 마다 다른 결과. 명시 tag 또는 digest sha256.- root 사용자 = 보안 위험.
USER 1000명시. - secret 을 ENV / ARG = image layer 에 평문 남음. BuildKit
--secret. - 거대한 image = transfer 느림. distroless / scratch / alpine 활용.
관련 위키
이 글의 용어 (4개)
- [Container] cgroups + namespaces: 컨테이너의 두 기둥virtualization
- 정의 컨테이너 = namespaces + cgroups + 파일시스템 (overlay). VM 이 아니라 host 의 프로세스 + 격리. Namespaces (격리) | Name…
- [Container] Image Best Practices: 작게, 안전하게virtualization
- 5가지 원칙 1. Base Image 선택 | Base | 크기 | 적합 | |---|---|---| | | 70 MB | 개발 / 디버깅 친화 | | | 40 MB | 일반 |…
- [Container] OCI Image: spec, manifest, layer 표준cloud
- 정의 OCI (Open Container Initiative) = 컨테이너 표준 (Linux Foundation, 2015). image format + runtime + dis…
- [K8s] Pod: 컨테이너의 최소 단위, sidecar, lifecyclekubernetes
- 정의 Pod = K8s 의 가장 작은 배포 단위. 1개 이상의 컨테이너 + 공유 네트워크 + 공유 스토리지. [!IMPORTANT] Pod 는 컨테이너의 wrapping 이 아니…
이 개념을 다룬 위키 페이지 (10)
- wiki[AWS] ECS + Fargate: 컨테이너 오케스트레이션
- wiki[Container] OCI Image: spec, manifest, layer 표준
- wiki[CI/CD] GitHub Actions: workflow, action, runner
- wiki[K8s] Pod: 컨테이너의 최소 단위, sidecar, lifecycle
- wiki[Container] cgroups + namespaces: 컨테이너의 두 기둥
- wiki[Container] Image Best Practices: 작게, 안전하게
- wikiLXC / LXD: System Containers, Docker 이전의 컨테이너
- wikiVirtual Machine (VM): guest OS, 스냅샷, 마이그레이션
- wiki가상화 (Virtualization): 하드웨어, OS, 컨테이너 계층 전체 정리
- wikiVM vs Container: 층 구조, 성능, 격리 완벽 비교
💬 댓글