Docker Compose란 무엇인가요?

Docker Compose란 무엇인가요?

Docker Compose를 사용하면 모든 컨테이너와 그 구성을 단일 YAML 파일에 정의할 수 있어요. 여러 개의 docker run 명령을 실행할 필요 없이 한 번에 멀티 컨테이너 애플리케이션을 시작하고 관리할 수 있어요. 이 가이드에서 Compose의 개념과 Node.js + MySQL 투두 리스트 앱 실행 방법을 배워요.

출처: 문서

본문

설명

지금까지 가이드를 따라왔다면 단일 컨테이너 애플리케이션으로 작업해 왔을 거예요. 이제 더 복잡한 것을 하고 싶을 거예요 — 데이터베이스, 메시지 큐, 캐시, 또는 다양한 다른 서비스를 실행하는 거죠. 모든 것을 단일 컨테이너에 설치할까요? 여러 컨테이너를 실행할까요? 여러 개를 실행한다면 어떻게 모두 연결할까요?

컨테이너의 모범 사례 중 하나는 "각 컨테이너는 한 가지 일을 하고, 그것을 잘 해야 한다"는 거예요. 이 규칙에는 예외가 있지만, 한 컨테이너가 여러 일을 하게 만드는 경향은 피하는 게 좋아요.

여러 개의 docker run 명령으로 여러 컨테이너를 시작할 수 있어요. 하지만 곧 네트워크를 관리하고, 컨테이너를 해당 네트워크에 연결하는 데 필요한 모든 플래그 등을 관리해야 한다는 걸 깨닫게 될 거예요. 그리고 작업이 끝나면 정리가 조금 더 복잡해져요.

Docker Compose를 사용하면 모든 컨테이너와 그 구성을 단일 YAML 파일에 정의할 수 있어요. 이 파일을 코드 저장소에 포함하면, 저장소를 클론하는 누구든 단일 명령으로 애플리케이션을 띄울 수 있어요.

Compose가 선언적(declarative) 도구라는 점을 이해하는 게 중요해요 — 정의하기만 하면 실행되는 거예요. 모든 것을 항상 처음부터 다시 만들 필요는 없어요. 변경 사항이 있으면 docker compose up을 다시 실행하면 Compose가 파일의 변경 사항을 조정하고 지능적으로 적용해요.

Dockerfile 대 Compose 파일

Dockerfile은 컨테이너 이미지를 빌드하는 지침을 제공하는 반면, Compose 파일은 실행 중인 컨테이너를 정의해요. Compose 파일은 특정 서비스에 사용할 이미지를 빌드하기 위해 Dockerfile을 참조하는 경우가 많아요.

직접 해보기

이 실습에서는 Docker Compose로 멀티 컨테이너 애플리케이션을 실행하는 방법을 배워요. 데이터베이스 서버로 MySQL을 사용하는 Node.js로 만든 간단한 투두 리스트 앱을 사용할 거예요.

애플리케이션 시작하기

다음 지침에 따라 투두 리스트 앱을 여러분의 시스템에서 실행해요.

  • Docker Desktop을 다운로드하고 설치해요.
  • 터미널을 열고 이 샘플 애플리케이션을 클론해요.
    git clone https://github.com/dockersamples/todo-list-app
    
  • todo-list-app 디렉터리로 이동해요.
    cd todo-list-app
    
    이 디렉터리 안에 compose.yaml이라는 파일이 있어요. 이 YAML 파일에서 모든 마법이 일어나요! 애플리케이션을 구성하는 모든 서비스와 그 구성을 정의해요. 각 서비스는 자신의 이미지, 포트, 볼륨, 네트워크, 그리고 기능에 필요한 기타 설정을 지정해요. 시간을 내어 YAML 파일을 탐색하고 구조에 익숙해져 보세요.
  • docker compose up 명령으로 애플리케이션을 시작해요.
    docker compose up -d --build
    
    이 명령을 실행하면 다음과 같은 출력이 보여요.
    [+] Running 5/5
    ✔ app 3 layers [⣿⣿⣿]      0B/0B            Pulled          7.1s
      ✔ e6f4e57cc59e Download complete                          0.9s
      ✔ df998480d81d Download complete                          1.0s
      ✔ 31e174fedd23 Download complete                          2.5s
      ✔ 43c47a581c29 Download complete                          2.0s
    [+] Running 4/4
      ⠸ Network todo-list-app_default           Created         0.3s
      ⠸ Volume "todo-list-app_todo-mysql-data"  Created         0.3s
      ✔ Container todo-list-app-app-1           Started         0.3s
      ✔ Container todo-list-app-mysql-1         Started         0.3s
    
    여기서 많은 일이 일어났어요! 몇 가지 짚고 넘어갈 점은: Docker Hub에서 두 개의 컨테이너 이미지(node와 MySQL)가 다운로드됐어요.
    • 애플리케이션을 위한 네트워크가 생성됐어요.
    • 컨테이너 재시작 사이에 데이터베이스 파일을 유지하기 위한 볼륨이 생성됐어요.
    • 필요한 모든 구성이 담긴 두 개의 컨테이너가 시작됐어요. 부담스러워 보여도 걱정하지 마세요! 곧 익숙해질 거예요!
  • 모든 게 실행되면 브라우저에서 http://localhost:3000 을 열어 사이트를 볼 수 있어요. 애플리케이션이 완전히 시작되는 데 10~15초가 걸릴 수 있다는 점에 유의하세요. 페이지가 바로 로드되지 않으면 잠시 기다렸다가 새로고침해요. 목록에 항목을 추가하고, 체크하고, 제거하는 것을 자유롭게 시도해 보세요.
  • Docker Desktop GUI를 보면 컨테이너를 확인하고 구성 내부를 자세히 들여다볼 수 있어요.

내려놓기 (Tear down)

이 애플리케이션은 Docker Compose로 시작됐기 때문에, 다 사용하고 나면 쉽게 모두 내려놓을 수 있어요.

  • CLI에서 docker compose down 명령으로 모든 것을 제거해요.
    docker compose down
    
    다음과 비슷한 출력이 보여요.
    [+] Running 3/3
    ✔ Container todo-list-app-mysql-1  Removed        2.9s
    ✔ Container todo-list-app-app-1    Removed        0.1s
    ✔ Network todo-list-app_default    Removed        0.1s
    

    볼륨 유지 기본적으로 Compose 스택을 내려놓을 때 볼륨은 자동으로 제거되지 않아요. 스택을 다시 시작하면 데이터를 되찾고 싶을 수 있기 때문이에요. 볼륨도 제거하려면 docker compose down 명령 실행 시 --volumes 플래그를 추가하세요.

    docker compose down --volumes
    [+] Running 1/0
    ✔ Volume todo-list-app_todo-mysql-data  Removed
    
  • 또는 Docker Desktop GUI에서 애플리케이션 스택을 선택하고 Delete 버튼을 눌러 컨테이너를 제거할 수 있어요.

    Compose 스택에 GUI 사용하기 GUI에서 Compose 앱의 컨테이너를 제거하면 컨테이너만 제거된다는 점에 유의하세요. 네트워크와 볼륨을 제거하려면 수동으로 제거해야 해요.

이 실습에서 Docker Compose로 멀티 컨테이너 애플리케이션을 시작하고 중지하는 방법을 배웠어요.

추가 자료

이 페이지는 Compose에 대한 간략한 소개였어요. 다음 자료에서 Compose와 Compose 파일 작성 방법을 더 깊이 파고들 수 있어요.

더 알아보기 (Learn more)