Published on

Docker 간단 정리

Authors
  • avatar
    Name
    sulmo
    Twitter

Docker 기초 개념 총정리

도커(Docker)는 애플리케이션을 이미지라는 패키지로 만들고, 이를 컨테이너라는 독립 환경에서 실행하는 기술이다. 도커를 처음 배우거나 헷갈릴 때마다 참고할 수 있도록 핵심 개념을 정리했다.


1. 빌드 컨텍스트(Build Context)와 COPY

  • docker build 실행 시 지정한 디렉토리(.) 전체가 빌드 컨텍스트다.
  • 이 컨텍스트 안의 파일만 Dockerfile에서 참조 가능하다.
  • 컨텍스트를 도커 데몬에 보냈다고 해서 자동으로 이미지에 포함되는 건 아니다.
  • 실제로 이미지에 넣으려면 COPYADD 지시어가 필요하다.
docker build -t myapp .
# '.' = 현재 디렉토리 전체가 빌드 컨텍스트
FROM node:20-alpine
WORKDIR /app
COPY . .        # 컨텍스트 전체를 /app 에 복사
RUN npm ci

.dockerignore 파일을 꼭 사용해 node_modules, .git 같은 불필요한 파일은 제외하자.


2. 레이어(Layer)

  • Dockerfile의 각 명령은 새로운 레이어를 만든다.
  • 레이어는 불변(immutable)하고 캐시로 재사용된다.
  • 빌드 속도를 높이려면 자주 바뀌는 명령은 뒤로 보내는 게 유리하다.
# 좋은 예시 (의존성 캐시 유지)
COPY package.json package-lock.json ./
RUN npm ci
COPY . .

3. 빌드 시점 vs 실행 시점

  • 빌드 시점: Dockerfile 안의 RUN, COPY, ENV 같은 명령이 실행되어 이미지 레이어에 반영된다.
  • 실행 시점: 컨테이너가 뜰 때 ENTRYPOINTCMD가 실행된다.
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm ci                   # 빌드 시점 실행
CMD ["node", "server.js"]    # 실행 시점 실행

Docker 빌드 시점 명령어 정리

명령어역할특징
FROM베이스 이미지 지정, 새 스테이지 시작멀티스테이지 빌드에서 여러 번 사용 가능
RUN컨테이너 내부에서 명령 실행실행 결과가 레이어에 저장됨
COPY빌드 컨텍스트 → 이미지 내부로 복사.dockerignore 반영
ADDCOPY와 유사하지만 tar 압축 해제, URL 다운로드 지원불필요할 땐 COPY 권장
ARG빌드 타임 변수 정의--build-arg로 전달, 빌드 후에는 소멸됨
ENV환경 변수 설정빌드 중/실행 시 모두 적용, 이미지 메타데이터에 남음
WORKDIR작업 디렉토리 변경이후 명령 실행 위치 지정, 없으면 자동 생성
EXPOSE문서화용 포트 지정실행 시 실제 포트 노출 기능은 없음
USER명령 실행할 사용자 지정빌드 시점 명령 및 실행 시점 모두에 적용
SHELLRUN에서 사용할 기본 쉘 지정Windows 이미지 등에서 주로 활용
LABEL메타데이터(버전, 작성자 등) 추가이미지에 정보 태그 저장
VOLUME익명 볼륨 마운트 포인트 지정컨테이너 실행 시 적용되지만 선언은 빌드 타임

4. 스테이지(Stage)와 멀티스테이지 빌드

  • Dockerfile에서 FROM이 나오면 새로운 스테이지가 시작된다.
  • AS <이름>은 단순히 스테이지에 붙이는 별칭.
  • 스테이지는 독립적이고 중첩될 수 없다.
  • 멀티스테이지 빌드는 빌드 환경과 런타임 환경을 분리해 최종 이미지를 더 작게 만든다.
# 빌더 스테이지
FROM node:20-alpine AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build

# 런타임 스테이지
FROM nginx:1.27-alpine AS runner
COPY --from=builder /app/dist /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
  • 기본적으로 마지막 스테이지가 최종 이미지가 된다.

5. 중간 스테이지 빌드 (--target)

  • 필요하다면 --target 옵션으로 특정 스테이지만 이미지로 만들 수 있다.
docker build -t myapp:builder --target builder .
docker build -t myapp:runner   .   # 기본 (마지막 스테이지)

활용:

  • 빌드 결과 디버깅
  • 캐시 활용
  • dev/prod 환경 구분

6. ENTRYPOINT vs CMD

  • CMD

    • 기본 실행 명령 또는 기본 인자.
    • 컨테이너 실행 시 다른 명령을 주면 CMD는 덮어씌워진다.
  • ENTRYPOINT

    • 항상 실행되는 실행 파일.
    • 컨테이너 실행 시 입력한 값은 ENTRYPOINT의 인자로 전달된다.
  • 조합

    • ENTRYPOINT = 실행 파일
    • CMD = 그 실행 파일의 디폴트 인자
ENTRYPOINT ["echo"]
CMD ["hello"]

# docker run myimg        → echo hello
# docker run myimg world  → echo world

7. 최종 이미지와 컨테이너 실행

  • Dockerfile의 마지막 스테이지가 최종 이미지가 된다.

  • 컨테이너를 실행하면, 이 이미지에서 지정된 ENTRYPOINT/CMD가 실행된다.

  • 즉:

    • 이미지 = 파일시스템 + 실행 환경
    • 컨테이너 = 그 이미지를 기반으로 실행된 프로세스