티스토리 뷰
📚 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의 장점과 단점을 명확히 이해하고, 필요에 따라 적절한 도구를 선택하시면 좋습니다.
'CI_CD' 카테고리의 다른 글
Sparse Checkout이란? (0) | 2025.03.20 |
---|---|
Git Submodule이란? (0) | 2025.03.20 |
GitLab을 포함한 Git 환경에서 레포지토리의 일부 코드나 디렉터리만 가져오는 5가지 방법 (0) | 2025.03.20 |
Scratch 컨테이너란? (0) | 2025.03.20 |
멀티 레포(Multi-Repo) vs 모노 레포(Mono-Repo) (0) | 2025.03.20 |