CICD

dockerfile과 docker-compose 비교 와 예제코드

마시멜로를찾아서 2025. 4. 2. 14:33
반응형

🧱 Dockerfile vs docker-compose 비교


 

항목 Dockerfile docker-compose
목적 단일 애플리케이션의 이미지를 정의 여러 컨테이너(서비스)를 통합 실행 및 관리
사용 방식 docker build → docker run docker-compose up, down으로 전체 서비스 컨트롤
주요 기능 OS, 종속성, 코드 복사, CMD 설정 여러 컨테이너 연결, 네트워크, 볼륨, 환경 변수 설정
장점 이식성, 이미지 버전관리, CI/CD 연동 마이크로서비스 또는 개발환경 전반 구성 자동화
단점 네트워크, DB, 연동 구성은 따로 필요 복잡한 빌드 옵션은 Dockerfile에 위임 필요

🐳 예제: Spring Boot + PostgreSQL

📁 폴더 구조

spring-boot-app/
├── Dockerfile
├── docker-compose.yml
├── target/myapp.jar
└── application.yml

📌 Dockerfile (Spring Boot)

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/myapp.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

📌 docker-compose.yml

version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/mydb
      SPRING_DATASOURCE_USERNAME: user
      SPRING_DATASOURCE_PASSWORD: pass

  db:
    image: postgres:15
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

🟣 예제: NestJS + Redis

📁 폴더 구조

nestjs-app/
├── Dockerfile
├── docker-compose.yml
├── src/
└── package.json

📌 Dockerfile (NestJS)

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "run", "start:prod"]

📌 docker-compose.yml

version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - redis
    environment:
      REDIS_HOST: redis
      REDIS_PORT: 6379

  redis:
    image: redis:7

🔧 예제: Kotlin + MySQL

dockerfile
 
# Dockerfile (Ktor)
FROM openjdk:17
COPY build/libs/app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
# docker-compose.yml
version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - mysql
    environment:
      DB_HOST: mysql
      DB_USER: user
      DB_PASS: pass

  mysql:
    image: mysql:8
    environment:
      MYSQL_DATABASE: mydb
      MYSQL_ROOT_PASSWORD: pass

✅ 정리 요약


 

용도 Dockerfile docker-compose
개별 이미지 정의 ❌ (Dockerfile 필요)
멀티 컨테이너 구성 ❌ (직접 명령어로 연결) ✅ 여러 서비스 정의 및 실행 자동화
CI/CD 활용도 고정된 이미지 빌드 dev/test 환경 구성, 테스트 병렬화에 유리
대표 명령어 docker build, docker run docker-compose up -d, logs, down

 

반응형