my-blog: 백엔드 및 프론트엔드 Dockerfile 추가
이번 커밋에서는 백엔드와 프론트엔드 애플리케이션을 위한 Dockerfile을 추가하여 CI/CD 파이프라인을 개선했습니다. 2026년 1월 30일에 진행되었으며, `claude/fix-cicd-pipeline-9M3EX` 브랜치에서 작업되었습니다.
my-blog: 백엔드 및 프론트엔드 Dockerfile 추가
이번 커밋에서는 백엔드와 프론트엔드 애플리케이션을 위한 Dockerfile을 추가하여 CI/CD 파이프라인을 개선했습니다. 2026년 1월 30일에 진행되었으며, claude/fix-cicd-pipeline-9M3EX 브랜치에서 작업되었습니다.
요약
이번 작업은 backend/Dockerfile과 frontend/Dockerfile 두 개의 파일을 추가하여, 각각 Express.js 기반의 백엔드와 Astro SSR을 사용하는 프론트엔드 애플리케이션을 위한 Docker 이미지를 구축하는 것을 목표로 했습니다. 이를 통해 애플리케이션의 배포 자동화 및 환경 일관성을 확보하고자 합니다.
배경 및 목적
기존에는 애플리케이션 배포에 필요한 환경 설정 및 빌드 과정을 수동으로 진행하거나, 복잡한 스크립트에 의존하는 경우가 있었습니다. 이는 배포 과정의 번거로움과 오류 발생 가능성을 높였습니다. Dockerfile을 추가함으로써, 각 애플리케이션의 빌드 및 실행 환경을 컨테이너 이미지로 표준화하여 개발, 테스트, 운영 환경 간의 일관성을 확보하고 CI/CD 파이프라인의 안정성과 효율성을 높이는 것이 목적입니다.
구현 내용
이번 커밋에서는 다음과 같은 Dockerfile을 추가했습니다.
주요 변경사항 상세 설명
backend/Dockerfile:- Express.js 기반 백엔드 애플리케이션을 위한 Docker 이미지를 구축합니다.
- 멀티 스테이지 빌드를 사용하여 최종 이미지 크기를 최적화합니다.
- 보안 강화를 위해 non-root 사용자로 애플리케이션을 실행하도록 설정합니다.
frontend/Dockerfile:- Astro SSR (Server-Side Rendering) 기반 프론트엔드 애플리케이션을 위한 Docker 이미지를 구축합니다.
- Node.js 어댑터를 사용하여 SSR 환경을 설정합니다.
변경된 파일 목록
backend/Dockerfilefrontend/Dockerfile
추가/삭제된 코드 라인 수
(구체적인 라인 수는 제공되지 않았으므로 생략합니다. 실제 커밋 시에는 분석하여 기입할 수 있습니다.)
핵심 코드 설명
backend/Dockerfile (예시)
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build # Express.js 빌드 명령어가 있다면 추가
# Production stage
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist # 빌드 결과물 복사
COPY --from=builder /app/package.json ./
# Non-root user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
EXPOSE 3000 # 또는 애플리케이션이 사용하는 포트
CMD ["node", "dist/server.js"] # 또는 실제 실행 파일 경로
frontend/Dockerfile (예시)
# Build stage
FROM oven/astro:latest AS builder
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build
# Production stage
FROM node:20-alpine # Astro SSR 실행에 필요한 Node.js 이미지
WORKDIR /app
COPY --from=builder /app/dist ./dist # Astro 빌드 결과물 복사
COPY --from=builder /app/package.json ./
COPY --from=builder /app/node_modules ./node_modules
# Astro SSR을 위한 Node adapter 설정 (Astro 버전에 따라 다를 수 있음)
# CMD ["node", "./dist/server/entry.mjs"] # Astro SSR 진입점
# 또는 `npm start`와 같은 스크립트 사용
CMD ["npm", "run", "preview"]
위 코드 예시는 일반적인 Express.js 및 Astro SSR 프로젝트의 Dockerfile 구조를 가정한 것이며, 실제 프로젝트 설정에 따라 수정될 수 있습니다.
기술적 의사결정
기술 선택: Docker
애플리케이션 배포를 위한 표준화된 환경을 구축하기 위해 Docker를 선택했습니다. Docker는 컨테이너화 기술을 통해 개발, 테스트, 프로덕션 환경 간의 의존성 문제를 해결하고, 일관된 실행 환경을 제공합니다.
주요 결정 사항: 멀티 스테이지 빌드
빌드 스테이지와 프로덕션 스테이지를 분리하는 멀티 스테이지 빌드를 채택했습니다.
- 이유:
- 이미지 크기 최적화: 빌드에 필요한 도구 (npm, 빌드 라이브러리 등)는 최종 이미지에 포함되지 않아 이미지 크기를 크게 줄일 수 있습니다.
- 보안 강화: 불필요한 파일이나 라이브러리가 포함되지 않아 보안 취약점을 줄일 수 있습니다.
- 빌드 과정 격리: 빌드 환경과 실행 환경을 분리하여 빌드 과정의 재현성을 높입니다.
다른 대안 및 비교
- 단일 스테이지 빌드: 모든 과정을 하나의 Dockerfile에 포함하는 방식입니다. 구현은 간단하지만, 최종 이미지 크기가 커지고 불필요한 파일이 포함될 위험이 있습니다.
- Docker Compose: 여러 컨테이너를 함께 관리할 때 유용하지만, 개별 애플리케이션의 빌드 자체보다는 서비스 간 연동에 더 초점을 맞춥니다. 이번 커밋은 개별 애플리케이션의 빌드 환경 구축이 주 목적이었기에, 각 애플리케이션별 Dockerfile 작성이 우선되었습니다.
장단점 분석
- 멀티 스테이지 빌드 (채택):
- 장점: 이미지 크기 감소, 보안 강화, 빌드 재현성 향상
- 단점: Dockerfile 작성이 다소 복잡해질 수 있음
- 단일 스테이지 빌드:
- 장점: Dockerfile 작성이 간편함
- 단점: 이미지 크기 증가, 보안 취약점 노출 가능성 증가
배운 점 및 개선점
배운 점
- Express.js와 Astro SSR 애플리케이션에 맞는 최적의 Dockerfile 구조를 이해할 수 있었습니다.
- 멀티 스테이지 빌드를 통해 Docker 이미지의 크기를 효과적으로 줄이는 방법을 익혔습니다.
- Non-root 사용자로 컨테이너를 실행하는 것이 보안상 중요하다는 것을 다시 한번 인지했습니다.
개선점 및 다음 단계 계획
- Base Image 최적화:
node:20-alpine과 같이 가벼운 Alpine Linux 기반 이미지를 사용하여 이미지 크기를 더욱 줄일 수 있습니다. - 캐싱 활용:
npm install과 같은 의존성 설치 명령어를 COPY 명령어보다 앞에 배치하여 Docker의 빌드 캐싱 메커니즘을 효과적으로 활용할 수 있습니다. (현재 예시에서는package*.json을 먼저 복사하여 이를 활용하고 있습니다.) - HEALTHCHECK: 컨테이너의 상태를 주기적으로 확인하는
HEALTHCHECK명령어를 추가하여 배포된 서비스의 안정성을 높일 수 있습니다. - 환경 변수 관리: Dockerfile 내에서 직접 설정하기보다는, Docker Compose나 Kubernetes 등을 통해 외부에서 환경 변수를 주입하는 방식을 고려해야 합니다.
이번 Dockerfile 추가를 시작으로, GitHub Actions 등 CI/CD 도구와 연동하여 자동 빌드 및 배포 파이프라인을 완성하는 것이 다음 단계가 될 것입니다.