HEYNOW/Blog
Docker Compose 멀티 컨테이너 구성 실전 가이드
dockerdocker-composecontainermulti-containerdev-environmentbackend

Docker Compose 멀티 컨테이너 구성 실전 가이드

·2분 읽기
모든 글 보기

백엔드와 데이터베이스를 따로 띄우느라 번거로웠다고? Docker Compose 하나로 여러 컨테이너를 손쉽게 묶어 개발 환경을 구축하는 방법을 알려줄게. 이제 더 이상 각개격파는 없어!

개발할 때 백엔드 따로, DB 따로, Redis 따로... 매번 각개격파하는 거 너무 귀찮지 않아? 'docker run'만 수십 번 치다가 손가락 부러질 뻔했다고! 이럴 때 우리에게 필요한 건 뭐다? 바로 Docker Compose지! 오늘은 Docker Compose 하나로 여러 컨테이너를 한 방에 띄우는 방법을 알아보자.

1. Docker Compose 파일 만들기

먼저 docker-compose.yml 파일을 만들어야 해. 이 파일이 바로 컨테이너들을 어떻게 구성할지 알려주는 설계도라고 생각하면 돼. 프로젝트 루트에 docker-compose.yml 파일을 만들고 아래처럼 시작해보자.

version: '3.8'
services:
  # 여기에 각 서비스(컨테이너)들을 정의할 거야

version은 Docker Compose 파일의 문법 버전을 나타내고, services 아래에 우리가 띄울 컨테이너들을 하나씩 추가할 거야.

2. 서비스 정의하기: 웹 애플리케이션

이제 백엔드 웹 애플리케이션 컨테이너를 정의해보자. 예시로 Node.js 앱을 만들어볼게.

version: '3.8'
services:
  webapp:
    build: .
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: development
      DATABASE_URL: postgres://user:password@db:5432/mydb
    depends_on:
      - db
  • webapp: 이 서비스의 이름이야. 다른 컨테이너에서 이 이름으로 접근할 수 있어.
  • build: .: 현재 디렉토리의 Dockerfile을 사용해서 이미지를 빌드하라는 뜻이야. 만약 이미 만들어진 이미지가 있다면 image: your-repo/your-image:tag처럼 쓸 수도 있어.
  • ports: 호스트(내 컴퓨터)와 컨테이너 포트를 연결해줘. "호스트포트:컨테이너포트" 형식이지.
  • environment: 컨테이너 내부에서 사용할 환경 변수들을 설정할 수 있어.
  • depends_on: db 서비스가 먼저 시작되어야 webapp이 시작되도록 순서를 지정해주는 거야. 서버가 DB 없이 뜨면 안 되잖아?

3. 서비스 정의하기: 데이터베이스

웹 애플리케이션과 함께 사용할 PostgreSQL 데이터베이스 컨테이너도 정의해보자.

version: '3.8'
services:
  webapp:
    build: .
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: development
      DATABASE_URL: postgres://user:password@db:5432/mydb
    depends_on:
      - db

  db:
    image: postgres:13
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:
  • db: 데이터베이스 서비스 이름이야. webapp에서 DATABASE_URLdb로 접근하는 걸 볼 수 있지?
  • image: postgres:13: postgres 이미지의 13 버전을 사용할 거야.
  • environment: DB 이름, 사용자, 비밀번호 등 DB 설정을 여기서 해줘.
  • volumes: DB 데이터가 컨테이너가 사라져도 날아가지 않도록 영구 저장 공간을 만들어주는 거야. db-data라는 볼륨을 만들고 /var/lib/postgresql/data 경로에 연결했어.
  • 마지막 volumes: db-data: 부분은 db-data라는 이름의 볼륨을 정의하는 부분이야.

depends_on은 컨테이너 시작 순서만 보장해줘. db 컨테이너가 '완전히 준비'될 때까지 기다려주진 않으니, 앱 코드에서 DB 연결 재시도 로직을 넣어주는 게 좋아!

4. Docker Compose 실행

docker-compose.yml 파일 작성이 끝났으면, 이제 프로젝트 루트 디렉토리에서 터미널을 열고 다음 명령어를 입력해보자.

docker compose up -d
  • up: docker-compose.yml 파일에 정의된 모든 서비스를 시작해줘.
  • -d: 컨테이너들을 백그라운드에서 실행하고 터미널 제어권을 돌려받는다는 뜻이야. (detached 모드)

명령어를 실행하면 Docker Compose가 필요한 이미지를 다운로드하고, 정의된 순서대로 컨테이너들을 띄울 거야. 간단하다!

5. 컨테이너 종료 및 삭제

이제 개발을 다 했거나 컨테이너를 재시작하고 싶다면 다음 명령어로 모든 서비스를 한 번에 내릴 수 있어.

docker compose down
  • down: docker-compose.yml 파일에 정의된 모든 컨테이너와 네트워크를 중지하고 제거해줘. 만약 -v 옵션을 추가하면 볼륨도 함께 삭제돼. (ex: docker compose down -v)

여기까지 하면 끝이다! 이제 여러 컨테이너를 Docker Compose로 손쉽게 관리할 수 있을 거야. 여러 서비스 띄우느라 고생하는 일은 더 이상 없을 거야!

Flutter 앱 개발이 필요하신가요?

HEYNOW와 함께라면 빠르고 완성도 있게 만들 수 있습니다.

문의하기 →

글이 도움이 되셨다면 공감 눌러주세요!
비회원도 공감 누를 수 있답니다 🙏

공유
dockerdocker-composecontainermulti-containerdev-environmentbackend

댓글 ...

최대 40자