Dockerfile 생성기

Dockerfile
결과

Dockerfile은 세부 사항을 떠올리기 전까지는 짧아 보이는 파일 중 하나입니다. 레이어 순서는 캐시에 영향을 주고, COPY package.jsonRUN npm install보다 앞에 와야 하며, 컴파일 언어는 멀티스테이지 빌드의 이점을 얻습니다. 이 생성기는 선택한 스택에 맞는 즉시 사용 가능한 Dockerfile을 캐시 패턴까지 올바르게 갖춰 작성합니다.

Dockerfile 생성 방법

  1. 1

    스택 선택

    Node.js, Python, PHP, Go, Rust 중에서 고릅니다. 각 템플릿은 해당 언어에 맞는 기본 이미지와 올바른 의존성 설치 명령을 사용합니다.

  2. 2

    작업 디렉터리와 포트 설정

    WORKDIR과 앱이 수신할 포트를 정하면 둘 다 생성된 파일에 기록됩니다.

  3. 3

    Dockerfile 확인

    EXPOSE 줄과 시작 명령이 앱과 맞는지 확인하세요. Go와 Rust 템플릿은 멀티스테이지 빌드를 사용합니다.

  4. 4

    Dockerfile 복사

    결과를 복사해 저장소 루트에 붙여넣고 이미지를 빌드하세요.

멀티스테이지 빌드의 이유

단순한 Dockerfile은 컴파일러 툴체인 전체를 최종 이미지에 설치합니다. 멀티스테이지 빌드는 컴파일을 담당하는 “builder” 스테이지와 컴파일된 산출물만 담는 최종 스테이지로 나눠 줍니다:

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

최종 이미지에서 모든 개발 의존성, 소스 파일, 빌드 캐시가 빠져 이미지 크기가 60-80퍼센트 줄어드는 경우가 많습니다.

기본 이미지 종류

템플릿은 가능한 slim 또는 alpine 이미지를 사용합니다. 기본 이미지를 직접 조정한다면 대표적인 선택지는 다음과 같습니다:

종류 일반적인 크기 선택 시점
full 300-900 MB 개발용 이미지, 드문 시스템 의존성
slim 80-200 MB 대부분의 언어에서 프로덕션 기본값
alpine 30-100 MB 작은 이미지, glibc와 musl 차이 주의
distroless 20-80 MB 최대 보안, 셸과 패키지 관리자 없음

레이어 캐시 규칙

Docker는 각 줄을 캐시하며, 레이어가 바뀌면 그 아래는 전부 다시 빌드됩니다. 변경 빈도가 낮은 순서는 다음과 같습니다:

  1. FROM 기본 이미지 (거의 안 바뀜).
  2. 시스템 패키지(apt-get install), 드물게 변경.
  3. 의존성 매니페스트(package.json, requirements.txt, composer.json).
  4. 의존성 설치 단계. 매니페스트가 바뀔 때만 실행.
  5. 소스 코드 복사. 가장 바쁜 레이어로, 이후는 커밋마다 다시 빌드.
  6. 컴파일과 최종 CMD.

이 순서를 어기는 것은 CI 빌드가 느려지는 가장 흔한 원인입니다.

보안 체크리스트

  • 비루트로 실행하기. 끝부분에 USER appuser(또는 USER 1000)를 지정.
  • 버전 고정하기. python:3.12.7-slimpython:3.12보다 낫고, 이는 python:latest보다 낫습니다.
  • /에 의존하지 말고 명시적 WORKDIR 설정하기.
  • 로컬 파일에는 ADD가 아닌 COPY 사용하기. ADD는 자동 압축 해제 부작용이 있습니다.
  • HEALTHCHECK를 추가해 오케스트레이터가 멈춘 프로세스를 감지하게 하기.
  • 패키지 캐시는 같은 RUN 줄에서 정리하기: apt-get install ... && rm -rf /var/lib/apt/lists/*.

자주 묻는 질문

slim은 대부분의 라이브러리 사전 컴파일 휠처럼 여전히 glibc 기반이라 더 안전한 기본값입니다. alpine은 musl을 사용해 Python(pandas, numpy)이나 Node(node-gyp 네이티브 모듈)에서 간혹 알 수 없는 런타임 버그를 일으킵니다. 이미지 크기가 중요하고 스택을 테스트했다면 alpine을 선택하세요.

네, 프로젝트에 추가하세요. 없으면 Docker가 저장소 전체를 빌드 컨텍스트로 데몬에 보냅니다: git 기록, node_modules, 로컬 .env 파일, 테스트. 느리고 캐시를 낭비하며 비밀 정보가 새어 나갑니다.

네. docker buildx--platform 옵션과 함께 사용하면 두 아키텍처를 한 번에 빌드할 수 있습니다. 템플릿이 사용하는 기본 이미지는 arm64 변형을 제공합니다.

아니요. 선택한 스택, 작업 디렉터리, 포트는 이 페이지에서 Dockerfile을 만드는 데만 사용되며 저장되거나 공유되지 않습니다.

관련 도구

이 도구는 다른 언어로도 제공됩니다