도커를 이용해서 실제 서비스를 할 때 우리는 종종 여러 컨테이너를 띄워야 하는 상황을 마주하게 됩니다. 예를 들어, 웹 애플리케이션(Node.js, Python 등) 컨테이너, 데이터베이스(MySQL, PostgreSQL) 컨테이너, 캐시(Redis) 컨테이너를 함께 실행해야 하나의 서비스가 완성됩니다.
이때 Docker Compose가 없다면, 각 컨테이너를 docker run 명령어로 일일이 실행해야 합니다. 이 과정에서 네트워크 연결, 볼륨 설정, 환경 변수 주입 등 길고 복잡한 명령어를 여러 번 입력해야 하므로 번거롭고 실수가 발생하기 쉽습니다. Docker Compose는 이 모든 과정을 하나의 설계도 파일(docker-compose.yml)에 담아 문제를 해결합니다. (그리고 이 파일은 보통 프로젝트의 최상위 디렉토리에 위치합니다)
Dockerfile : 개별 요리(예: 스테이크, 샐러드)를 위한 레시피입니다.
docker run : 레시피를 보고 요리 하나를 직접 만드는 행위입니다.
docker-compose.yml : 스테이크, 샐러드, 수프로 구성된 코스 요리 전체의 계획서입니다. 각 요리가 무엇이고, 어떤 순서로, 어떻게 함께 나가야 하는지 정의합니다.
docker-compose up : 계획서를 보고 주방팀 전체에 "코스 요리 시작해!"라고 지시하는 것과 같습니다. 모든 요리가 알아서 조리되고 준비됩니다.
# 포그라운드에서 실행 (로그가 터미널에 계속 출력됨)
docker-compose up
# 백그라운드(detached mode)에서 실행 (가장 일반적으로 사용)
docker-compose up -d
docker-compose down : up으로 생성된 컨테이너, 네트워크 등 모든 리소스를 중지하고 제거합니다.
docker-compose down
# 컨테이너와 함께 볼륨(데이터)까지 모두 삭제
docker-compose down -v
docker-compose ps : 서비스 상태 확인
docker-compose logs : 로그 확인
# 모든 서비스의 로그 보기
docker-compose logs
# 특정 서비스(예: web)의 로그만 보기
docker-compose logs web
# 실시간으로 로그 추적하기 (-f 옵션)
docker-compose logs -f web
docker-compose build : Dockerfile이 변경되었을 때 이미지를 다시 빌드합니다.
- services : 실행하려는 각 컨테이너(서비스)를 정의하는 최상위 키입니다.
- 서비스 이름 (예: web, db) : 각 서비스를 식별하는 이름입니다. 이 이름은 컨테이너 간의 네트워크 통신에서 호스트 이름으로 사용됩니다.
- image : 사용할 Docker 이미지 이름을 지정합니다. (예: nginx:latest, mysql:8.0)
- build : Docker 이미지를 직접 빌드할 경우, Dockerfile이 있는 경로를 지정합니다.
- links : Docker run 명령어의 --link와 같으며 다른 서비스에 서비스 명만으로 접근할 수 있도록 설정
- ports : 호스트와 컨테이너 간의 포트를 연결합니다. ("호스트_포트:컨테이너_포트")
- volumes : 데이터를 영속적으로 저장하거나, 호스트의 파일을 컨테이너와 공유할 때 사용합니다. ("호스트_경로:컨테이너_경로")
- environment : 컨테이너 내부에서 사용할 환경 변수를 설정합니다. (예: 데이터베이스 접속 정보. docker run 명령어의 --env, -e 옵션과 동일)
- networks : 컨테이너들이 사용할 네트워크를 정의합니다. (지정하지 않으면 Compose가 기본 네트워크를 생성해 줍니다.)
- depends_on : 서비스 간의 의존 관계를 설정합니다. 예를 들어, web 서비스가 db 서비스에 의존한다면, db가 시작된 후에 web이 시작됩니다.
YAML 예시
# docker-compose.yml
version: '3.8' # 파일 형식 버전을 지정 (최신 버전 권장)
services:
# 1. 웹 애플리케이션 서비스 (Node.js)
web:
# 현재 디렉토리의 Dockerfile을 사용하여 이미지 빌드
build: .
# 호스트의 8080 포트를 컨테이너의 3000 포트로 연결
ports:
- "8080:3000"
# 현재 디렉토리 전체를 컨테이너의 /usr/src/app 경로와 동기화
volumes:
- .:/usr/src/app
# 환경 변수 설정
environment:
- REDIS_HOST=redis
# 'redis' 서비스가 시작된 후에 이 서비스를 시작
depends_on:
- redis
# 2. 데이터베이스 서비스 (Redis)
redis:
# Docker Hub에서 redis:alpine 이미지를 가져와 사용
image: "redis:alpine"
# 'db-data'라는 이름의 볼륨을 컨테이너의 /data 경로에 마운트
# 이렇게 하면 컨테이너가 사라져도 데이터는 보존됨
volumes:
- db-data:/data
# 데이터 영속성을 위해 사용할 Docker 볼륨 정의
volumes:
db-data:
'프로그래밍 > DevOps & MLops 관련정보' 카테고리의 다른 글
| [Airflow] Airflow Architecture (1) | 2025.08.30 |
|---|---|
| [Airflow] Airflow 기본 구성요소 (6) | 2025.08.30 |
| [Docker] Pycharm으로 Docker Interpreter 연결하기 (0) | 2025.08.27 |
| [Airflow] Airflow 설치하기 (10) | 2025.08.11 |
| [Docker] Docker 설치하기 (0) | 2025.08.11 |