Dockerfile 생성기
언어와 프레임워크 버전을 선택하면 최적화된 멀티스테이지 Dockerfile을 생성합니다.
Dockerfile
# ---- Builder Stage ----
FROM node:22-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json* ./
RUN npm ci
COPY . .
# ---- Runtime Stage ----
FROM node:22-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/package.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/ ./
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
EXPOSE 3000
CMD ["node", "index.js"]Dockerfile 생성기 -- 프로덕션 레디 컨테이너 이미지 구축
Dockerfile은 Docker 이미지를 빌드하기 위한 텍스트 명령어 파일입니다. 이 생성기는 Node.js, Python, Go, Java, Rust 등 5개 언어와 14개 프레임워크에 맞는 최적화된 Dockerfile을 자동으로 생성하며, 멀티스테이지 빌드, non-root 사용자, .dockerignore 등 Docker 공식 베스트 프랙티스가 기본 적용됩니다.
Dockerfile 핵심 명령어 레퍼런스
| 명령어 | 역할 | 예시 |
|---|---|---|
FROM | 베이스 이미지 지정 | FROM node:22-alpine |
RUN | 빌드 시 명령 실행(레이어 생성) | RUN npm ci |
COPY | 호스트 파일을 이미지로 복사 | COPY . . |
CMD | 컨테이너 시작 시 기본 명령 | CMD ["node","server.js"] |
ENTRYPOINT | 컨테이너의 실행 진입점 | ENTRYPOINT ["java","-jar","app.jar"] |
EXPOSE | 컨테이너 포트 문서화 | EXPOSE 3000 |
USER | 실행 사용자 변경 | USER appuser |
멀티스테이지 빌드(Multi-stage Build)의 원리
멀티스테이지 빌드는 하나의 Dockerfile 안에 여러 FROM 문을 사용하여 빌드 단계(Builder Stage)와 실행 단계(Runtime Stage)를 분리하는 기법입니다. 빌드 도구(컴파일러, 패키지 매니저)는 Builder에만 존재하고, 최종 이미지에는 실행에 필요한 바이너리/아티팩트만 복사(COPY --from=builder)합니다.
- Go: 빌드 이미지 ~1GB → 최종 이미지 ~15MB(Alpine + 정적 바이너리)
- Java: JDK 이미지 ~400MB → JRE 이미지 ~200MB
- Node.js: node_modules 포함 ~500MB → standalone 빌드 ~100MB
레이어 캐시 최적화 전략
Docker는 각 RUN, COPY 명령을 하나의 레이어로 관리하며, 변경되지 않은 레이어는 캐시에서 재사용합니다. 따라서 변경 빈도가 낮은 명령을 먼저 배치하는 것이 핵심입니다. 예를 들어 package.json을 먼저 복사하고 npm ci를 실행한 뒤, 소스 코드를 복사하면 소스 코드만 변경되었을 때 의존성 설치 레이어를 재사용할 수 있습니다.
.dockerignore -- 빌드 컨텍스트 최적화
.dockerignore 파일은 Docker 빌드 컨텍스트에서 제외할 파일/디렉토리를 지정합니다. node_modules, .git, .env,dist/ 등을 제외하면 빌드 컨텍스트 전송 시간이 단축되고, 민감한 파일이 이미지에 포함되는 것을 방지합니다.
베이스 이미지 선택: Alpine vs. Distroless
- Alpine: musl libc 기반, 패키지 매니저(apk) 포함, ~5MB. 디버깅에 유리합니다.
- Distroless: Google이 관리하는 최소 이미지, 셸/패키지 매니저 없음. 공격 표면을 극소화합니다.
- slim: Debian 기반 경량 이미지, glibc 호환. Python/Java에 적합합니다.
보안 체크리스트
- 반드시 non-root 사용자를 설정하세요(USER 명령).
- 베이스 이미지의 CVE(취약점)를
docker scout또는trivy로 스캔하세요. - 빌드 시
--no-cache플래그를 사용하면 최신 패치가 반영됩니다. - .env 파일, SSH 키, API 시크릿이 이미지에 포함되지 않도록 .dockerignore를 확인하세요.
관련 도구
Compose 파일이 필요하면 Docker Compose 생성기를, 서버 접속 키는 SSH 키 생성기를, 파일 권한 설정은 chmod 계산기를 활용하세요.
참고 자료
- Docker Docs -- Dockerfile reference (docs.docker.com)
- Docker Docs -- "Best practices for writing Dockerfiles"
- Google -- Distroless container images (github.com/GoogleContainerTools)
- Snyk -- "10 Docker Security Best Practices"