- Published on
Docker 간단 정리
- Authors
- Name
- sulmo
Docker 기초 개념 총정리
도커(Docker)는 애플리케이션을 이미지라는 패키지로 만들고, 이를 컨테이너라는 독립 환경에서 실행하는 기술이다. 도커를 처음 배우거나 헷갈릴 때마다 참고할 수 있도록 핵심 개념을 정리했다.
1. 빌드 컨텍스트(Build Context)와 COPY
docker build
실행 시 지정한 디렉토리(.
) 전체가 빌드 컨텍스트다.- 이 컨텍스트 안의 파일만 Dockerfile에서 참조 가능하다.
- 컨텍스트를 도커 데몬에 보냈다고 해서 자동으로 이미지에 포함되는 건 아니다.
- 실제로 이미지에 넣으려면
COPY
나ADD
지시어가 필요하다.
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
같은 명령이 실행되어 이미지 레이어에 반영된다. - 실행 시점: 컨테이너가 뜰 때
ENTRYPOINT
와CMD
가 실행된다.
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm ci # 빌드 시점 실행
CMD ["node", "server.js"] # 실행 시점 실행
Docker 빌드 시점 명령어 정리
명령어 | 역할 | 특징 |
---|---|---|
FROM | 베이스 이미지 지정, 새 스테이지 시작 | 멀티스테이지 빌드에서 여러 번 사용 가능 |
RUN | 컨테이너 내부에서 명령 실행 | 실행 결과가 레이어에 저장됨 |
COPY | 빌드 컨텍스트 → 이미지 내부로 복사 | .dockerignore 반영 |
ADD | COPY와 유사하지만 tar 압축 해제, URL 다운로드 지원 | 불필요할 땐 COPY 권장 |
ARG | 빌드 타임 변수 정의 | --build-arg 로 전달, 빌드 후에는 소멸됨 |
ENV | 환경 변수 설정 | 빌드 중/실행 시 모두 적용, 이미지 메타데이터에 남음 |
WORKDIR | 작업 디렉토리 변경 | 이후 명령 실행 위치 지정, 없으면 자동 생성 |
EXPOSE | 문서화용 포트 지정 | 실행 시 실제 포트 노출 기능은 없음 |
USER | 명령 실행할 사용자 지정 | 빌드 시점 명령 및 실행 시점 모두에 적용 |
SHELL | RUN에서 사용할 기본 쉘 지정 | 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 /app/dist /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
- 기본적으로 마지막 스테이지가 최종 이미지가 된다.
--target
)
5. 중간 스테이지 빌드 (- 필요하다면
--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가 실행된다.
즉:
- 이미지 = 파일시스템 + 실행 환경
- 컨테이너 = 그 이미지를 기반으로 실행된 프로세스