[Docker] 도커 컴포즈(Docker Compose)로 멀티 컨테이너 한방에 관리하기

2026. 2. 4. 20:36·개발 환경 | 도구/Docker | 컨테이너

1. 개요

실제 서비스는 웹 서버 하나로만 돌아가지 않습니다. DB(MySQL)도 필요하고, 캐시(Redis)도 필요합니다.
만약 도커 컴포즈가 없다면 우리는 매번 이렇게 해야 합니다.

  1. docker network create my-net (네트워크 만들기)
  2. docker run --network my-net --name db mysql... (DB 띄우기)
  3. docker run --network my-net --name app my-app... (앱 띄우기)

Docker Compose는 이 복잡한 과정과 옵션들을 yaml 파일 하나에 정의해두고, 실행 한 번으로 모든 컨테이너를 오케스트레이션(지휘)하는 도구입니다.


2. 전체 구조 요약 (Run vs Compose)

명령어로 칠 때는 매번 옵션을 기억해야 하지만, 컴포즈는 '문서(Code)'로 남습니다.

[ 기존 방식 (Imperative) ]
$ docker run -d -p 80:80 node-app
$ docker run -d -p 3306:3306 mysql
(옵션 까먹으면 접속 불가, 순서 꼬임)

       vs

[ Docker Compose (Declarative) ]
docker-compose.yml 파일에 정의
   ├── web (node-app)
   └── db (mysql)
       ↓
$ docker-compose up -d (끝!)

3. 구성 준비물

항목 설명
Docker Desktop 컴포즈가 기본 내장되어 있습니다.
docker-compose.yml 컨테이너 설정을 담을 설정 파일
VS Code YAML 파일 편집을 위한 에디터

4. 단계별 구성 절차

4-1. docker-compose.yml 작성 (핵심 ⭐)

프로젝트 루트 경로에 docker-compose.yml 파일을 만들고 아래 내용을 작성합니다.
(예시: Node.js 웹 앱과 Redis 데이터베이스를 같이 띄우는 상황)

version: '3.8'  # 컴포즈 파일 규격 버전

services:       # 실행할 컨테이너들의 모음
  my-app:       # 서비스 이름 1 (웹 서버)
    build: .    # 현재 폴더의 Dockerfile로 빌드해서 써라
    ports:
      - "3000:3000"
    depends_on: # 이게 다 켜져야 나를 켜라 (순서 보장)
      - my-redis

  my-redis:     # 서비스 이름 2 (DB)
    image: redis:alpine # 도커 허브 이미지를 그대로 사용
    ports:
      - "6379:6379"

4-2. 마법의 네트워크 (Magic DNS)

도커 컴포즈의 가장 큰 장점은 자동 네트워크 연결입니다.
my-app 컨테이너 안에서 코드를 짤 때, Redis 접속 주소를 IP(192.168.x.x)가 아닌 서비스 이름(my-redis)으로 적으면 알아서 찾아갑니다.

// Node.js 코드 예시
const client = redis.createClient({
    url: 'redis://my-redis:6379' // 서비스 이름이 곧 호스트명!
});

4-3. 실행 및 관리 명령어

이제 터미널에서 딱 한 줄만 입력하세요.

# 1. 모든 서비스 실행 (백그라운드)
docker-compose up -d

# 2. 실행 상태 확인
docker-compose ps

# 3. 로그 확인 (전체 컨테이너 로그가 섞여서 나옴)
docker-compose logs -f

# 4. 종료 및 삭제 (컨테이너, 네트워크 모두 정리)
docker-compose down

5. 실무 운영 꿀팁

5-1. 코드 수정 후 재배포 (--build)

docker-compose up은 이미지가 이미 있으면 새로 빌드하지 않습니다. 코드를 수정했다면 반드시 --build 옵션을 붙여야 합니다.

docker-compose up -d --build

5-2. DB 데이터 영구 저장 (Volumes)

컨테이너를 삭제(down)하면 DB 데이터도 날아갑니다. 이를 막기 위해 볼륨(Volume)을 설정해야 합니다.

  my-db:
    image: mysql:8.0
    volumes:
      - ./db_data:/var/lib/mysql  # 내 컴퓨터 ./db_data 폴더와 동기화

5-3. 환경 변수 분리 (.env)

비밀번호 같은 민감한 정보는 docker-compose.yml에 직접 적지 말고 .env 파일로 빼세요.

[.env 파일]

MYSQL_PASSWORD=secret1234

[docker-compose.yml]

environment:
  MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}

'개발 환경 | 도구 > Docker | 컨테이너' 카테고리의 다른 글

[Kubernetes] 쿠버네티스가 너무 어렵다면? 초경량 MicroK8s(마이크로 k8s)로 입문하기  (0) 2026.02.08
[Docker] Dockerfile 작성법과 이미지 빌드(Build) 최적화 가이드  (0) 2026.02.04
[Docker] 도커 명령어 완전 정복 및 컨테이너 생명주기(Lifecycle) 관리  (0) 2026.02.01
[Docker] 도커(Docker)란? 가상머신과의 차이점 및 완벽 기초 개념 정리  (0) 2026.01.28
'개발 환경 | 도구/Docker | 컨테이너' 카테고리의 다른 글
  • [Kubernetes] 쿠버네티스가 너무 어렵다면? 초경량 MicroK8s(마이크로 k8s)로 입문하기
  • [Docker] Dockerfile 작성법과 이미지 빌드(Build) 최적화 가이드
  • [Docker] 도커 명령어 완전 정복 및 컨테이너 생명주기(Lifecycle) 관리
  • [Docker] 도커(Docker)란? 가상머신과의 차이점 및 완벽 기초 개념 정리
알쓸신개
알쓸신개
  • 알쓸신개
    알아두면 쓸모있는 신기한 개발지식
    알쓸신개
  • 전체
    오늘
    어제
    • 분류 전체보기 (92)
      • 웹 기초 | 디자인 (2)
        • HTML (0)
        • CSS (0)
        • 반응형 (0)
        • 웹 지식 | 웹 표준 | 접근성 (2)
      • 프론트엔드 (6)
        • JavaScript (6)
        • DOM 조작 | AJAX (0)
        • TypeScript (0)
        • Vue.js | React | JSX (0)
        • Webpack | Vite | 웹 컴포넌트 (0)
      • 백엔드 (28)
        • PHP (6)
        • Laravel (18)
        • CodeIgniter (0)
        • JAVA (0)
        • Spring (0)
        • 디자인 패턴 (2)
        • 테스트 코드 작성 (0)
        • 보안 | 인증 (1)
      • 데이터베이스 (5)
        • SQL 기초 (1)
        • MariaDB | MySql (0)
        • 데이터베이스 설계 (1)
        • 쿼리 최적화(튜닝) (0)
      • 실무 | 성장 (11)
        • 프로젝트 사례 (2)
        • 트러블슈팅 | 개발팁 (9)
        • 커리어 관련 (0)
        • 코드 리뷰 | 스터디 (0)
        • 애자일 | 스크럼 | 작업 방법론 (0)
      • 개발 환경 | 도구 (36)
        • 버전관리 (Git) (3)
        • 개발 도구 (IDE, 에디터 등) (3)
        • 서버 | 인프라 | 배포 | 운영 (14)
        • Docker | 컨테이너 (5)
        • CI | CD (2)
        • 클라우드 환경 (AWS | GCP) (9)
      • 보안 (3)
        • 보안 | 인증 전반 (2)
        • CSRF | XSS 대응 (0)
        • SQL 인젝션 (0)
        • 암호화 | 해시 (0)
        • 보안 취약점 분석 (1)
      • AI & 머신러닝 (0)
        • AI 툴의 특성 (0)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
알쓸신개
[Docker] 도커 컴포즈(Docker Compose)로 멀티 컨테이너 한방에 관리하기
상단으로

티스토리툴바