Setting Log/Docker

[Docker] Docker Compose 개념 및 실전 구축 가이드

odong 2026. 7. 6. 10:13

지난 포스팅에서 도커 이미지와 컨테이너의 독립적인 개념을 이해했습니다. 하지만 실제 서비스를 프로덕션 환경에 배포하려면 하나의 컨테이너만으로는 부족합니다.

간단한 웹 애플리케이션 하나만 만들더라도 [웹 가동 서버 컨테이너(Python/Java 등)] + [데이터베이스 컨테이너(MySQL/PostgreSQL)] + [인메모리 캐시(Redis)]가 맞물려 돌아가야 합니다.

수많은 컨테이너들을 명령어 한 줄로 동시에 띄우고, 관리하고, 내부 사설 가상 네트워크 환경까지 한 방에 세팅해 주는 툴이 바로 도커 컴포즈(Docker Compose)입니다. 오늘은 도커 컴포즈의 명세 구조와 실전 아키텍처 코드를 뜯어봅니다.

1. Docker Compose를 사용하는 이유

도커 컴포즈가 없다면 개발자는 서버를 배포할 때마다 아래와 같이 명령어를 터미널에 일일이 타이핑해야 합니다.

$ docker network create my-network
$ docker run -d --name my-db --network my-network -e MYSQL_ROOT_PASSWORD=secret mysql:8.0
$ docker run -d --name my-web -p 80:80 --network my-network my-web-app:latest

명령어가 길어지면 휴먼 에러(오타, 환경 변수 누락, 포트 충돌)가 발생할 확률이 비대해집니다.

도커 컴포즈는 복잡한 가동 인프라 설정을 docker-compose.yml 이라는 단 하나의 YAML 파일에 명세화합니다. 인프라 환경 전체를 소스 코드처럼 형상 관리할 수 있게 되며, 다른 엔지니어가 와도 명령어 한 줄로 환경을 똑같이 재현해 냅니다.

2. 예제: Web 서버 + MySQL 멀티 컨테이너 설계하기

백엔드 진영에서 가장 기본이 되는 '웹 애플리케이션과 MySQL DB'를 독립된 컨테이너로 띄우고 내부 네트워크로 묶는 docker-compose.yml 실전 아키텍처 스크립트입니다.

version: '3.8'

services:
  # 1. 데이터베이스 컨테이너 레이어
  db-service:
    image: mysql:8.0
    container_name: production-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root_password_secret
      MYSQL_DATABASE: my_app_db
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql

  # 2. 백엔드 웹 애플리케이션 컨테이너 레이어
  web-service:
    image: nginx:latest  # 예시용 웹 서버 (실무에선 자체 빌드 이미지 매핑)
    container_name: production-web
    restart: always
    ports:
      - "80:80"
    depends_on:
      - db-service # DB 컨테이너가 먼저 완전히 가동된 후 웹 서버를 순차 구동

# 3. 영속성 데이터 보존을 위한 가상 볼륨 정의
volumes:
  db-data:

 핵심 키워드 메커니즘 파헤치기

  • services: 가동할 컨테이너 단위들을 정의합니다. 여기서는 db-service와 web-service 두 개가 돌아갑니다.
  • ports (호스트 포트 : 컨테이너 내부 포트): 브라우저에서 80 포트로 찌르면 컨테이너 내부 웹 서버로 통로를 열어줍니다.
  • depends_on: 가동 순서의 가드레일입니다. 데이터베이스 가동전에 웹이 먼저 켜져서 나오는 연결 에러 현상을 방지합니다.
  • volumes: 컨테이너는 삭제되면 내부 데이터가 날아가는 휘발성 프로세스입니다. 이를 방지하기 위해 호스트 서버의 실제 디스크 공간을 컨테이너 내부 DB 저장소 경로와 링크해 두어, 컨테이너를 껐다 켜도 데이터가 영구 보존되도록 아키텍처를 방어합니다.

3. Docker-compose 핵심 명령어

도커 컴포즈 파일이 위치한 디렉토리 경로 터미널에서 아래 명령어를 가동합니다.

# 1. 컴포즈 파일에 명세된 모든 컨테이너, 네트워크, 볼륨을 백그라운드(-d)에서 일괄 빌드 및 가동
$ docker-compose up -d

# 2. 현재 가동 중인 멀티 컨테이너들의 통합 리소스 및 프로세스 상태 스캔
$ docker-compose ps

# 3. 여러 컨테이너에서 뿜어져 나오는 표준 출력 로그(Log)를 실시간 스트리밍으로 추적 디버깅
$ docker-compose logs -f

# 4. 가동 중인 모든 컨테이너를 안전하게 중지하고, 생성된 내부 사설 가상 네트워크 인프라까지 깔끔하게 제거
$ docker-compose down

 싱글 노드 배포의 종착지

도커 컴포즈를 다룰 줄 알게 되었다는 것은 단일 서버 환경에서 배포할 수 있는 아키텍처 설계 능력이 한단계 올라갔다는 뜻입니다.

컴포즈 파일 내에서 컨테이너들은 별도의 IP 주소를 외울 필요 없이, 서비스 이름(db-service) 자체를 도메인 호스트 네임으로 삼아 인메모리 내부 통신이 가능해집니다. 일관된 격리 환경을 활용해 로컬 개발 환경과 리눅스 운영 서버의 배포 파이프라인 가속기를 완성해 보시기 바랍니다.