Docker: 컨테이너화로 배포 간단하게
개발팀
2분 읽기
DockerDevOps배포
Docker: 컨테이너화로 배포 간단하게
Docker는 애플리케이션과 그 환경을 함께 패킹하여 어디서든 실행할 수 있게 해줍니다.
Dockerfile 작성
# Node.js 애플리케이션 예제
FROM node:18-alpine
WORKDIR /app
# 의존성 설치
COPY package*.json ./
RUN npm ci --only=production
# 애플리케이션 코드
COPY . .
# 포트 노출
EXPOSE 3000
# 헬스 체크
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s \
CMD node healthcheck.js
# 시작 명령어
CMD ["npm", "start"]
이미지 빌드 및 실행
# 이미지 빌드
docker build -t my-app:1.0 .
# 컨테이너 실행
docker run -p 3000:3000 -e NODE_ENV=production my-app:1.0
# 백그라운드 실행
docker run -d -p 3000:3000 --name my-app-container my-app:1.0
Docker Compose
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://postgres:password@db:5432/mydb
depends_on:
- db
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
db:
image: postgres:15-alpine
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
유용한 Docker 명령어
# 이미지 목록 확인
docker images
# 실행 중인 컨테이너 확인
docker ps
# 모든 컨테이너 확인
docker ps -a
# 컨테이너 로그 확인
docker logs <container-id>
# 컨테이너 멈추기
docker stop <container-id>
# 컨테이너 제거
docker rm <container-id>
# 이미지 제거
docker rmi <image-id>
멀티 스테이지 빌드
# 빌드 단계
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 실행 단계
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm ci --only=production
CMD ["npm", "start"]
이미지 최적화
- 작은 베이스 이미지: alpine 버전 사용
- 불필요한 파일 제외:
.dockerignore파일 사용 - 레이어 최소화: 관련 명령어 병합
- 캐싱 활용: 변경 빈도가 낮은 명령어를 먼저 실행
# .dockerignore 파일
node_modules
.git
.env
.DS_Store
dist
보안 고려사항
# 루트 사용자 제거
RUN useradd -m appuser
USER appuser
# 읽기 전용 파일 시스템
RUN chmod -R a-w /app
배포 및 오케스트레이션
# Docker Hub에 푸시
docker tag my-app:1.0 username/my-app:1.0
docker push username/my-app:1.0
# Kubernetes로 배포
kubectl apply -f deployment.yaml
Docker를 효과적으로 사용하면 배포 과정이 훨씬 간단해집니다.