1. Dockerfile 구성 요소 (적용 시점 주의)
Dockerfile 명령어들은 빌드 시점과 컨테이너 실행 시점에 따라 역할이 다르다.
빌드 시점 전용
- ARG
- key=value 형태
- 빌드할 때만 사용
- 컨테이너(애플리케이션) 실행 시에는 사용 불가
이미지/컨테이너 공통
- FROM
- 베이스 이미지 지정
- Repository:Tag 형식
- LABEL
- 이미지 메타데이터
- 이미지 관리용
- Kubernetes 환경에서 매우 중요
- ENV
- key=value
- 컨테이너 실행 시에도 사용 가능
2. 파일 및 디렉토리 처리
- ADD
- 파일 또는 디렉토리 복사
- 원격 URL 다운로드 가능
- <remote 주소 | src 경로> <dest 경로>
- 실무에서 더 자주 사용
- COPY
- 로컬 파일/디렉토리 복사
- 다른 이미지에서 가져오는 용도
- ADD보다 기능 제한적이라 상대적으로 덜 사용됨
3. 실행 환경 관련 설정
- USER
- 컨테이너에서 사용할 사용자 권한 설정
- WORKDIR
- 작업 디렉토리 설정
- 이후 명령어(RUN, CMD 등)의 기준 경로
- RUN
- 이미지 빌드 과정에서 실행할 명령어
- 패키지 설치, 설정 작업 등에 사용
4. 컨테이너 실행 관련 명령어
- CMD
- 컨테이너 실행 시 기본 명령어
- override 가능
- ENTRYPOINT
- 컨테이너 진입점
- 변경 불가 (CMD보다 강제성 높음)
- EXPOSE
- 컨테이너가 사용하는 포트 명시
- 실제 포트를 여는 기능은 없음
- 협업 및 문서화를 위한 주석 역할
5. 안전한 서비스 운영을 위해 필요한 요소
미래를 고려한 Dockerfile 작성 시 중요 포인트
- 협업
- 주석 처리
- LABEL, EXPOSE 적극 활용
- 비용
- 불필요한 레이어 제거
- 이미지 경량화
- 유지보수
- 명확한 구조
- ARG, ENV 활용
- 보안
- 불필요한 root 권한 지양
- 최소 권한 원칙 적용
6. Dockerfile 예시 분석
ARG TAG=22.04
FROM ubuntu:$TAG
LABEL PROJECT=cloudwave
ENV STAGE=prod
ADD https://docs.docker.com/engine/reference/builder/sample.html
COPY ./jar /src/jar
USER root
WORKDIR /root
RUN apt-get update && apt-get upgrade
CMD ["/bin/bash"]
ENTRYPOINT [""]
흐름 해석
- ARG로 Ubuntu 버전 유연하게 관리
- LABEL로 프로젝트 정보 명시
- ENV로 실행 환경 구분 (prod)
- ADD로 원격 리소스 포함
- WORKDIR 기준 작업 디렉토리 설정
- RUN으로 이미지 빌드 단계 작업 수행
- CMD로 기본 실행 쉘 지정
- 시험: FROM 위에 선언된 ARG는 바로 아래 FROM 한테만 적용. 그 밑에 줄에서 ARG 값을 받으면 값 없음으로 뜸
7. 멀티스테이지 빌드 개념
빌드 환경과 실행 환경이 다를 때 사용하는 방식
1단계: 빌드 스테이지
- 컴파일용 이미지 사용
- 소스 코드 복사
- 빌드 수행 → 실행 파일 생성
2단계: 런타임 스테이지
- 실행 전용 이미지 사용 (예: scratch, alpine)
- 빌드 스테이지에서 생성된 결과물만 복사
- 불필요한 빌드 도구 제거
8. Docker 캐시 개념
- Docker는 명령어 단위로 결과를 캐싱
- 같은 명령어 = 같은 결과라고 가정
- 캐시를 잘 활용하면 빌드 속도 향상
- 하지만:
- 같은 명령어라도 상황에 따라 결과가 달라야 한다면
- 캐시로 인해 예상치 못한 오류 발생 가능
- 따라서 명령어 순서와 캐시 전략이 중요
9. 좋은 Dockerfile의 조건
- 빌드 속도가 빠르다
- 캐시 히트율 증가
- 이해하기 쉽다
- 명확한 명령어 순서
- 작업이 간결하다
- 적절한 베이스 이미지 사용
- 이미지 크기가 작다
- 빌드용/런타임용 이미지 분리
- 보안 취약점이 적다
- 최소 패키지
- 최소 권한
'Docker' 카테고리의 다른 글
| Docker_Cloudwave캠프: Stateful 컨테이너와 로그 파이프라인 (0) | 2026.01.02 |
|---|---|
| Docker_Cloudwave 캠프: Docker 기본 개념과 컨테이너 실행 구조 (0) | 2025.12.31 |
| Docker: 다중 컨테이너 구축 (2) | 2025.05.28 |
| Docker: 네트워킹 (1) | 2025.05.22 |
| Docker: 데이터 관리 및 볼륨 (1) | 2025.05.19 |