Docker 기본: Docker Compose

Docker Compose란 무엇인가?
calendar icon

2025년 5월 7일

조회 1

tag icon

✅ Docker Compose란?

Docker Compose는 여러 개의 Docker 컨테이너를 하나의 파일로 정의하고, 한 번에 실행·관리할 수 있게 해주는 도구이다.

조금 더 풀어서 말하면:

  • 보통 하나의 애플리케이션은 여러 서비스로 구성된다.

    (예: 웹 서버 + 데이터베이스 + 캐시 서버)

  • 이때 각각을 따로 docker run 명령으로 하나하나 띄우는 건 굉장히 번거롭다.

  • 그래서,

    • 어떤 컨테이너를,
    • 어떤 이미지로,
    • 어떤 환경변수 설정으로,
    • 어떤 포트를 열고,
    • 서로 어떻게 연결할지,
  • 이런 모든 것을 docker-compose.yml 이라는 파일에 한 번에 정의하는 것이다.

  • 그리고 docker compose up 한 줄로 모든 서비스를 한꺼번에 실행할 수 있다.


📚 예시

웹 서버 + 데이터베이스 구성 시 일반 Docker 명령 방식

docker run -d --name db -e MYSQL_ROOT_PASSWORD=root mysql:5.7
docker run -d --name web -p 8080:80 --link db:mysql nginx

→ 컨테이너가 2개 이상이면 명령어 관리가 복잡해짐.


Docker Compose로 쓰면

docker-compose.yml

version: "3"
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
  web:
    image: nginx
    ports:
      - "8080:80"
    depends_on:
      - db

그리고 터미널에서는 단 한 줄:

docker compose up -d

→ 웹 서버와 DB가 동시에 연결되어 실행된다.


✅ Docker Compose를 쓰면 뭐가 좋은가?

항목설명
실행 자동화여러 컨테이너를 한 번에 실행하고 관리할 수 있다
설정 일원화docker-compose.yml 하나만 수정하면 서비스 전체 설정 관리 가능
코드처럼 관리YAML 파일이기 때문에 Git 버전 관리가 가능하다
네트워킹 자동화컨테이너끼리 자동으로 내부 네트워크로 연결된다 (link 따로 안 걸어도 됨)
포트, 볼륨, 환경변수 설정 편리명령어로 일일이 입력할 필요 없이 파일에 모두 정리해놓을 수 있다
복잡한 앱 아키텍처 지원마이크로서비스, 풀스택 앱 등을 깔끔하게 정의할 수 있다
테스트 환경 구축개발/테스트 서버를 쉽게 똑같이 재현할 수 있다 (로컬=서버 환경 일치)

🔥 Docker Compose를 꼭 쓰는 대표적인 상황

  • 웹 서버 + DB 서버 + 캐시 서버를 동시에 구성해야 할 때
  • 마이크로서비스(수십 개 API) 환경을 관리할 때
  • 개발환경(로컬)과 프로덕션 환경(서버)을 일치시킬 때
  • 테스트 환경을 매번 손쉽게 초기화하고 복원할 때
  • DevOps 자동화(CI/CD 파이프라인 구축)에 연동할 때

🎯 요약

Docker Compose는 복잡한 Docker 컨테이너 구성을 코드화(YAML)해서 한 번에 실행하고 관리하는 도구다.

단일 명령어로 전체 애플리케이션 아키텍처를 자동화하고 재현할 수 있게 한다.


✅ 사용 명령어 기본 정리

명령어설명
docker compose up -ddocker-compose.yml을 기준으로 모든 컨테이너를 생성/실행 (백그라운드)
docker compose down생성된 모든 컨테이너, 네트워크, 볼륨 제거
docker compose ps실행 중인 서비스 목록 보기
docker compose logs서비스 로그 보기
docker compose build변경된 이미지 다시 빌드

🧠 추가로 알아두면 좋은 점

  • 최신 Docker 버전(Docker 20.10 이상)에서는 docker-compose 명령어가 → docker compose (띄어쓰기)로 통합되었다.
  • docker-compose.yml 파일은 항상 현재 디렉토리에 있어야 자동으로 인식한다.
  • 각 컨테이너는 **자동으로 별도의 네트워크(docker network)**에 묶인다. (내부 통신 자동 지원)

✅ Docker Compose 실전 예시

🛠️ 상황 설정

  • 웹 서버: Node.js로 간단한 API 서버
  • 데이터베이스: MySQL 5.7
  • 요구사항:
    • Node.js 서버가 MySQL에 연결해야 한다.
    • 두 컨테이너를 하나의 명령어로 동시에 띄운다.
    • 외부에서는 Node.js 서버에만 접근 가능하게 한다.

📄 docker-compose.yml 예시

version: "3.9"  # docker compose 파일 버전

services:
  db:
    image: mysql:5.7
    container_name: mysql-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: myappdb
      MYSQL_USER: myappuser
      MYSQL_PASSWORD: myapppassword
    ports:
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql

  app:
    build: ./app  # app 폴더에 Dockerfile이 있다고 가정
    container_name: node-app
    restart: always
    ports:
      - "3000:3000"
    environment:
      DB_HOST: db
      DB_USER: myappuser
      DB_PASSWORD: myapppassword
      DB_DATABASE: myappdb
    depends_on:
      - db

volumes:
  db_data:

🧩 구성 해설

항목설명
services실행할 컨테이너 정의 (db, app)
image사용할 Docker Hub 이미지 (mysql:5.7)
build직접 빌드할 앱 (Node.js 앱 Dockerfile 경로)
container_name컨테이너 이름 지정
restart: always서버 재부팅해도 자동 재시작
environment컨테이너에 전달할 환경변수 설정
ports호스트와 컨테이너 간 포트 매핑
depends_ondb가 먼저 준비된 후 app이 실행되도록 설정
volumesMySQL 데이터가 날아가지 않도록 데이터 영속화

🖥️ 디렉토리 구조 예시

project-root/
  ├── docker-compose.yml
  └── app/
      ├── Dockerfile
      ├── package.json
      └── index.js
  • app/ 폴더 안에 Node.js 서버 소스코드와 Dockerfile이 있는 구조입니다.

🛠️ app/Dockerfile 예시 (Node.js 서버용)

FROM node:18

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

🚀 실행 방법

1. docker-compose.yml 파일이 있는 경로로 이동

cd project-root/

2. 전체 서비스 빌드 + 실행

docker compose up -d
  • d 옵션은 백그라운드 모드 실행 (detached)

3. 컨테이너 상태 확인

docker compose ps
  • db와 app 컨테이너가 모두 떠 있는지 확인

✅ 실행 결과

  • Node.js 앱은 서버IP:3000으로 접근 가능
  • Node.js 앱은 내부적으로 db라는 이름으로 MySQL에 접속 가능 (Compose가 내부 네트워킹을 자동 연결해줌)
  • MySQL 데이터는 db_data 볼륨에 안전하게 저장됨

📚 최종 흐름 요약

docker-compose.yml 작성
  ↓
Dockerfile 준비 (app 서버용)
  ↓
docker compose up -d
  ↓
모든 컨테이너 자동 생성 + 실행
  ↓
서비스 운영

🎯 최종 결론

Docker Compose는 여러 컨테이너를 하나의 파일로 정의하고,

한 번에 생성/실행/관리할 수 있게 하는 최고의 방법이다.

실전에서는 웹 서버 + DB 같이 여러 서비스를 구성할 때 필수로 사용된다.

좋아요 —
hamburger icon

무링의 개발 블로그

FDE를 향하는 개발자


댓글

GitHub 계정으로 로그인하면 댓글을 남길 수 있습니다.

로그인

연관된 글