DockerCompose

1. 필요성

  1. 여러 컨테이너 정의 및 실행
    • DockerCompose는 여러 컨테이너를 정의하고 실행하기 위한 도구다.
    • 복잡한 애플리케이션은 여러 서비스로 구성되며, 각 서비스는 독립적인 컨테이너로 실행된다.
  2. 복잡한 애플리케이션 구성
    • 단일 Dockerfile로는 복잡한 애플리케이션을 구성하기에 어려움이 있다.
    • 컨테이너 간 상호작용이 필요한 경우 더욱 문제가 된다.
    • 컨테이너의 설정과 실행 순서, 의존성을 관리하는 것이 어렵다.
  3. 일관된 환경 유지
    • 개발, 테스트, 배포 환경에서 일관된 컨테이너 설정을 유지하기에 용이하다.
    • DockerCompose로 모든 동일한 환경에서 동일한 설정으로 컨테이너를 실행할 수 있어서 환경 불일치에서 오는 문제를 최소화 할 수 있다.

2. 복잡한 애플리케이션에서 DockerCompose

  1. 다중 컨테이너 정의
    • 복잡한 애플리케이션은 보통 여러 서비스로 구성되고 각 서비스는 독립된 컨테이너로 실행됨
    • DockerCompose는 이러한 서비스를 정의하고 의존성 관리에 효율적
    • 환경 변수 관리 : 환경변수, 네트워크 설정, 볼륨 마운트 등의 설정을 명시적으로 YAML에 정의하여 일관된 환경을 제공
    • 네트워크 구성 : 자동으로 네트워크 구성하여, 서비스 간의 통신을 지원한다.
    • 배포 자동화: 단일 명령으로 모든 서비스를 실행할 수 있어, 배포를 자동화할 수 있다.
  2. 복잡한 애플리케이션 구성
    • DockerCompose는 여러 서비스를 정의하고 실행할 때 모든 설정를 YAML 하나에 담아 관리할 수 있다.
  3. 환경 설정 관리
    • .env를 사용하여 환경 변수를 관리할 수 있다.
  4. 네트워크 구성
    • DockerCompose는 프로젝트에 대해서 독립된 네트워크를 자동으로 생성하여, 서비스 간의 통신을 지원한다.
  5. 서비스 간 의존성 관리
    • DockerCompose는 서비스 간의 의존성을 관리할 수 있다.
  6. 데이터 지속성 관리
    • 볼륨을 사용하여 데이터의 지속성을 관리할 수 있다.
  7. 다중 환경 지원
    • DockerCompose는 여러 개의 환경을 지원할 수 있다. (개발, 테스트, 프로덕션 등)
  8. 로컬 개발 환경 구성
    • 여러 서비스를 동시에 실행해야 하는 경우 편리하다.
  9. 일관된 테스트 환경 제공
    • 통합테스트, end-to-end 테스트를 위한 환경을 쉽게 구성할 수 있다.

DockerCompose의 기본 네트워크 동작 방식

  1. 자동 네트워크 생성: DockerCompose에서 별도 네트워크 정의가 없다면, 각 Compose 프로젝트에 대해서 기본 네트워크를 자동으로 생성한다.(bridge)
  2. DNS 기반 통신 : DockerCompose는 서비스를 생성할 떄, 각 서비스를 DNS로 자동 등록한다. ```yaml services: app: ~ mongodb: ~

#이 경우 app, monggodb가 DNS ```

환경에 따른 YAML

  1. docker-compose.dev.yml, docker-compose.stage.yml, docker-compose.prod.yml와 같이 분리
  2. .env를 통해서 분리 .env.dev, .env.prod -> docker-compose --env-file .env.dev up -d