도커란 무엇이냐?
애플리케이션을 컨테이너로 묶어 어떤 환경에서든 동일하게 실행가능하도록 해주는 오픈 소스 프로젝트다
꽤나 유용해보여서 정리해 본다
이미지(Image): 앱 실행에 필요한 OS·런타임·라이브러리·소스가 겹겹이 쌓인 “스냅샷”
컨테이너(Container): 이미지를 실제로 띄운 실행 인스턴스(프로세스). 여러 개 가능
레지스트리(Registry): 이미지를 저장/공유하는 창고(예: Docker Hub, GHCR)
Dockerfile에 환경 만드는 레시피 적는다
docker build로 이미지 만든다
docker run으로 컨테이너 실행한다
myapp/
├─ Dockerfile
├─ .dockerignore
├─ app/ # 소스코드
└─ requirements.txt or package.json ...
빌드 속도↑, 이미지 용량↓, 시크릿 유출 방지
.git
__pycache__/
node_modules/
*.log
.env
.env.*
Dockerfile로 이미지 빌드할 때 제외할 파일 명시하는 역할이다
# 1) 베이스 이미지 선택
FROM python:3.12-slim
# 2) 시스템 패키지 (필요할 때만)
RUN apt-get update && apt-get install -y --no-install-recommends \
curl build-essential \
&& rm -rf /var/lib/apt/lists/*
# 3) 작업 디렉터리
WORKDIR /app
# 4) 의존성 캐시 최적화: 스펙 파일만 먼저 복사
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 5) 애플리케이션 복사
COPY app ./app
# 6) 컨테이너 런타임 계정 (루트 지양)
RUN useradd -m appuser
USER appuser
# 7) 포트/환경변수/헬스체크/엔트리포인트
EXPOSE 8000
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
# 8) 실제 프로세스 실행
CMD ["python", "-m", "app"]
# HEALTHCHECK: 컨테이너 상태 감시
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD curl -f http://localhost:8000/health || exit 1
# 멀티스테이지 빌드(빌드용 → 실행용)
# 빌드 이미지
FROM node:20 AS build
WORKDIR /src
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 실행 이미지
FROM nginx:alpine
COPY --from=build /src/dist /usr/share/nginx/html
# 이미지 빌드
docker build -t myapp:dev .
# 컨테이너 실행/중지/삭제
docker run -p 5173:5173 myapp:dev
docker ps
docker stop <id>
docker rm <id>
# Compose
docker compose up -d --build # 빌드 + 백그라운드 실행
docker compose down # 컨테이너/네트워크 삭제(볼륨은 유지)
docker compose down -v # 볼륨까지 삭제(데이터 초기화)
docker compose restart frontend # 특정 서비스 재시작
docker compose logs -f frontend # 로그 계속 보기
docker compose exec backend sh # 컨테이너 쉘 들어가기
# 볼륨/네트워크
docker volume ls
docker volume rm <name>
# 이미지/레이어 캐시 이슈 있을 때
docker compose build --no-cache frontend