CI_CD

Docker Compose란?

ipxy 2025. 3. 20. 10:06
728x90

📚 Docker Compose란?

Docker Compose는 여러 개의 Docker 컨테이너로 구성된 애플리케이션을 쉽게 정의하고 실행할 수 있게 해주는 도구입니다. 복잡한 환경 설정을 하나의 docker-compose.yml 파일로 관리할 수 있습니다.

장점:

  • 멀티 컨테이너 앱의 설정을 쉽고 명확하게 관리
  • 서비스 간 네트워크 자동 설정 및 환경변수 관리
  • 확장성과 유지보수 용이성 향상

📌 Docker Compose의 핵심 용어

  • 서비스(Service): 실행할 애플리케이션 컨테이너
  • 볼륨(Volume): 데이터를 영구적으로 저장하는 공간
  • 네트워크(Network): 서비스 간 통신을 위한 네트워크 공간
  • 환경변수(Environment Variables): 컨테이너 내부 설정 값 관리

🚩 1. 간단한 서비스 하나 실행하기

간단한 스프링부트 앱을 Docker Compose로 실행하는 예시입니다.

docker-compose.yml

version: '3.8'

services:
  myapp:
    image: myapp-image:latest
    ports:
      - "8080:8080"

✅ docker-compose up -d 실행 시 8080포트로 접근 가능
✅ URL: http://localhost:8080


🚩 2. 스프링부트와 MySQL 연동하기

스프링부트 앱과 MySQL을 연동하는 예시입니다.

docker-compose.yml

version: '3.8'

services:
  app:
    build: ./app
    container_name: spring-app
    ports:
      - "8080:8080"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb?useSSL=false
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=password
    depends_on:
      - db
    networks:
      - backend

  db:
    image: mysql:8.0
    container_name: mysql-db
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: mydb
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - backend

networks:
  backend:

volumes:
  mysql-data:

✅ 애플리케이션은 DB 서비스(db)가 먼저 실행된 이후에 실행됩니다.
✅ URL: http://localhost:8080


🚩 3. 여러 개의 스프링부트 서비스 연동하기 (마이크로서비스)

여러 개의 스프링부트 마이크로서비스를 구성할 때의 예시입니다.

docker-compose.yml

version: '3.8'

services:
  order-service:
    build: ./order-service
    ports:
      - "8081:8080"
    environment:
      - PRODUCT_SERVICE_URL=http://product-service:8080
    networks:
      - spring-network
    depends_on:
      - product-service

  product-service:
    build: ./product-service
    ports:
      - "8082:8080"
    networks:
      - spring-network

networks:
  spring-network:

✅ 서비스 간 호출 시 http://product-service:8080 와 같은 내부 DNS를 사용합니다.
✅ order-service: http://localhost:8081
✅ product-service: http://localhost:8082


🚩 4. Redis 추가하여 캐싱 사용하기

Redis를 스프링부트와 함께 사용하는 예시입니다.

docker-compose.yml

version: '3.8'

services:
  app:
    build: ./app
    ports:
      - "8080:8080"
    environment:
      - REDIS_HOST=redis
      - REDIS_PORT=6379
    depends_on:
      - redis
    networks:
      - app-network

  redis:
    image: redis:7.0
    container_name: redis-cache
    ports:
      - "6379:6379"
    networks:
      - app-network

networks:
  app-network:

✅ 스프링부트에서 spring.redis.host=redis로 설정하면 캐싱 가능


🚩 5. Kafka 연동하기

스프링부트와 Kafka 메시지 브로커 연동 예시입니다.

docker-compose.yml

version: '3.8'

services:
  kafka:
    image: confluentinc/cp-kafka:latest
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    depends_on:
      - zookeeper
    networks:
      - kafka-network

  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
    networks:
      - kafka-network

  app:
    build: ./app
    ports:
      - "8080:8080"
    environment:
      KAFKA_BOOTSTRAP_SERVERS: kafka:9092
    depends_on:
      - kafka
    networks:
      - kafka-network

networks:
  kafka-network:

✅ 스프링부트에서 Kafka 연결 URL을 kafka:9092로 지정


🚩 6. 볼륨을 이용해 데이터 영속화하기

데이터를 보존하기 위한 볼륨 활용 예시입니다.

version: '3.8'

services:
  db:
    image: postgres:16
    container_name: postgres-db
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  pgdata:

✅ PostgreSQL의 데이터를 영속적으로 관리합니다.


🚀 Docker Compose 주요 명령어 정리

명령어 설명

docker-compose up 컨테이너를 빌드하고 실행 (실행 로그 표시)
docker-compose up -d 백그라운드로 실행
docker-compose build 컨테이너 이미지만 빌드
docker-compose down 컨테이너 종료 및 삭제
docker-compose ps 컨테이너 상태 확인
docker-compose logs [서비스명] 서비스 로그 확인
docker-compose exec [서비스명] [명령어] 컨테이너 내부에서 명령어 실행

 

구분  장점 ✅  단점 ❌
사용 용이성 쉽고 빠르게 멀티 컨테이너 환경 구성 가능 복잡해지면 YAML 파일 관리가 어려워짐
설정 관리 YAML로 직관적이고 단순한 설정 가능 서비스가 많아질수록 유지보수가 어려움
서비스 간 통신 자동 네트워크 구성으로 서비스 간 통신이 쉬움 네트워크 설정이 복잡해지면 관리가 어렵고, 트러블슈팅이 어려워짐
볼륨 관리 데이터 영속화를 위한 볼륨 관리가 쉬움 볼륨 데이터 백업, 복구 및 관리가 별도로 필요
단일 호스트 vs 분산 배포 단일 호스트에서 간단한 앱 실행에 최적화 여러 호스트에 분산 배포 불가능
오케스트레이션 기능 단순한 컨테이너 배포에 적합 장애 감지, 자동 복구 및 오토스케일링 등 고급 기능 부재
수평 확장성 간단한 수평 확장(docker-compose scale) 가능 로드밸런싱이나 고급 확장 기능은 제한적
보안 간단한 환경변수로 설정 가능 민감정보(secrets)의 안전한 관리 미흡
배포 전략 간단한 배포 시나리오에 적합 복잡한 배포 전략(Blue-Green, Canary 등) 지원 제한
모니터링·로깅 간단한 로그 보기 가능 (docker-compose logs) 체계적인 로깅·모니터링 시스템 별도 구축 필요

🚩 Docker Compose가 적합한 경우

  • 로컬 개발 및 테스트 환경 구축
  • 중소규모 애플리케이션 배포
  • 단일 서버에서 간단한 컨테이너 앱 운영

🚩 Docker Compose가 부적합한 경우

  • 대규모 분산 운영 환경
  • 고가용성(HA) 및 복잡한 장애 복구 요구 사항
  • 민감한 정보를 다루는 보안 중심 환경
  • 복잡한 배포 전략이 필요한 환경

이 표를 바탕으로 Docker Compose의 장점과 단점을 명확히 이해하고, 필요에 따라 적절한 도구를 선택하시면 좋습니다.

728x90