Docker Compose로 멀티 컨테이너 어플리케이션 정의하고 실행하기

Docker Compose로 멀티 컨테이너 어플리케이션 정의하고 실행하기

멀티 컨테이너 Docker 어플리케이션을 정의·구성·실행하는 과정을 단순화해볼게요.

출처: 문서

본문

개발자는 멀티 컨테이너 Docker 어플리케이션에서 복잡한 구성, 의존성 관리, 일관된 환경 유지라는 도전에 마주해요. 네트워킹, 리소스 할당, 데이터 영속화, 로깅, 모니터링이 이런 어려움을 더해요. 보안 문제와 트러블슈팅 이슈는 과정을 더 복잡하게 만들어, 효율적인 관리를 위한 효과적인 도구와 관행이 필요해요.

Docker Compose는 어플리케이션에 필요한 모든 컨테이너를 단일 YAML 파일로 정의·구성·실행하는 간단한 방법을 제공해 멀티 컨테이너 Docker 어플리케이션 관리 문제를 해결해요. 이 접근법은 개발자가 일관된 개발·테스트·프로덕션 환경을 쉽게 설정·공유·유지하게 해주고, 복잡한 어플리케이션이 모든 의존성과 서비스로 제대로 구성·오케스트레이션되어 배포될 수 있게 보장해요.

배우게 될 내용

  • Docker Compose가 무엇이고 무엇을 하는지
  • 서비스를 정의하는 방법
  • Docker Compose의 사용 사례
  • Docker Compose가 없다면 상황이 어떻게 달라질지

누구를 위한 가이드인가요?

  • 여러 환경에서 멀티 컨테이너 Docker 어플리케이션을 효율적으로 정의·관리·오케스트레이션해야 하는 개발자와 DevOps 엔지니어
  • 개발 워크플로를 간소화하고 설정 시간을 줄여 생산성을 높이고 싶은 개발 팀

도구 통합

Docker CLI, CI/CD 도구, 컨테이너 오케스트레이션 도구와 잘 작동해요.

왜 Docker Compose인가요?

Docker Compose는 멀티 컨테이너 Docker 어플리케이션을 정의하고 실행하기 위한 필수 도구예요. Docker Compose는 YAML 파일로 어플리케이션 서비스를 구성할 수 있게 해 개발자가 앱을 더 쉽게 만들고, 관리하고, 배포할 수 있게 해 Docker 경험을 단순화해요.

Docker Compose는 여러 이점을 제공해요:

  • 멀티 컨테이너 어플리케이션을 단일 YAML 파일로 정의할 수 있게 해줘요.
  • 개발, 테스트, 프로덕션 전반에서 일관된 환경을 보장해줘요.
  • 여러 컨테이너의 시작과 연결을 손쉽게 관리해줘요.
  • 개발 워크플로를 간소화하고 설정 시간을 줄여줘요.
  • 각 서비스가 자체 컨테이너에서 실행되게 해 충돌을 피하게 해줘요.

데모: Docker Compose 설정 및 사용

이 Docker Compose 데모는 멀티 컨테이너 어플리케이션 환경을 오케스트레이션하는 방법을 보여주며 개발과 배포 과정을 간소화해요.

  • Docker Compose를 docker run 명령과 비교하기
  • Compose 파일로 멀티 컨테이너 웹 앱 구성하기
  • 한 명령으로 멀티 컨테이너 웹 앱 실행하기

흔한 도전과 질문

개발, 테스트, 스테이징 환경마다 별도의 Compose 파일을 유지해야 하나요?

반드시 환경마다 완전히 별도의 Compose 파일을 유지할 필요는 없어요. 모든 서비스를 단일 Compose 파일(compose.yaml)에 정의할 수 있어요. 프로파일(profile)을 사용해 각 환경(dev, test, staging)에 특화된 서비스 구성을 그룹화할 수 있어요.

환경을 띄울 때 해당 프로파일을 활성화하면 돼요. 예를 들어 개발 환경을 설정하려면:

$ docker compose --profile dev up

이 명령은 dev 프로파일과 연결된 서비스만 시작하고 나머지는 비활성 상태로 둬요.

프로파일 사용에 대한 자세한 내용은 Compose에서 프로파일 사용하기를 참고하세요.

데이터베이스 서비스가 프론트엔드 서비스보다 먼저 시작하도록 강제하려면 어떻게 하나요?

Docker Compose는 depends_on 속성을 사용해 서비스가 특정 순서로 시작되게 보장해요. 이는 Compose가 프론트엔드 서비스를 시작하려고 시도하기 전에 데이터베이스 서비스를 먼저 시작하라고 알려줘요. 어플리케이션이 종종 연결 가능한 데이터베이스에 의존하기 때문에 이는 매우 중요해요.

하지만 depends_on 은 순서만 보장할 뿐 데이터베이스가 완전히 초기화됐다는 것을 보장하지는 않아요. 특히 마이그레이션 후 준비된 데이터베이스에 의존하는 어플리케이션이라면, 더 견고한 접근법을 위해 헬스 체크(health checks)를 고려해보세요. 프론트엔드가 데이터베이스가 헬스 체크를 통과할 때까지 기다렸다가 시작하도록 구성할 수 있어요. 이렇게 하면 데이터베이스가 실행 중일 뿐만 아니라 요청을 처리할 준비가 되었는지도 보장돼요.

서비스 시작 순서 설정에 대한 자세한 내용은 Compose에서 시작·종료 순서 제어하기를 참고하세요.

Compose로 Docker 이미지를 빌드할 수 있나요?

네, Docker Compose로 Docker 이미지를 빌드할 수 있어요. Docker Compose는 멀티 컨테이너 어플리케이션을 정의하고 실행하는 도구예요. 내 어플리케이션이 멀티 컨테이너 어플리케이션이 아니더라도, Docker Compose는 모든 docker run 옵션을 파일에 정의해 실행을 더 쉽게 만들어줘요.

Compose를 사용하려면 compose.yaml 파일이 필요해요. 이 파일에서 각 서비스의 빌드 컨텍스트와 Dockerfile을 지정할 수 있어요. docker compose up --build 명령을 실행하면 Docker Compose가 각 서비스의 이미지를 빌드한 다음 컨테이너를 시작해요.

Compose로 Docker 이미지를 빌드하는 자세한 내용은 Compose 빌드 규격을 참고하세요.

Docker Compose와 Dockerfile의 차이는 무엇인가요?

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

docker compose up 과 docker compose run 명령의 차이는 무엇인가요?

docker compose up 명령은 모든 서비스를 생성하고 시작해요. 개발 환경을 실행하거나 전체 어플리케이션을 실행하기에 완벽해요. docker compose run 명령은 개별 서비스에 초점을 맞춰요. 지정한 서비스와 그 의존성을 시작해 해당 컨테이너 안에서 테스트를 실행하거나 일회성 작업을 수행할 수 있게 해줘요.

더 알아보기 (Learn more)

  • Docker Compose 개요
  • Compose 파일 참조
  • Compose 빌드 규격