본문 바로가기

DEVELOP_NOTE/Docker

[Docker]Docker Compose

보통 간단한 서비스를 POC할때, docker container를 하나 만들어, 개발을 진행하곤 한다.

하지만, 여러개의 애플리케이션과 데이터베이스를 구성해서 사용해야할때, 각 애플리케이션과 데이터베이스는 

서로 다른 환경과 종속성을 가지고 만들어져야할때가 있다.

이때, 만약 각 애플리케이션이 실행된 container를 별도로 관리하고 모니터링 해야한다면 매우 불편할 수 있을것이다.

이와 같이 복수의 docker container를 운영할때, 이를 동시에 실행, 관리 하기 위한 도구인 docker compose를 알아보려한다.

 

 

Docker Compose란?

  • Docker 기반의 multi container 애플리케이션을 "정의", "실행", "관리"하기 위한 도구이다.

 

Docker Compose의 장점?

  • 웹 애플리케이션의 경우 웹 서버 컨테이너와 데이터 베이스 컨테이너 등 여러개의 컨테이너로 구성되는 경우가 많은데, Docker Compose를 사용하면 각 컨테이너의 구성 정보를 한 곳에서 관리할 수 있으며 컨테이너간의 의존성을 자동으로 처리하여 애플리케이션을 쉽게관리할 수 있다.
  • 여러개의 Docker 컨테이너를 한번에 실행하고, 각 컨테이너의 네트워크 연결 및 데이터 볼륨 공유를 자동으로 처리할 수 있음
  • 여러 컨테이너를 동시에 실행하거나 컨테이너간의 의존성 관리를 자동으로 처리할 수 있음

 

웹 서버 컨테이너와 데이터베이스 컨테이너를 따로 구성하는 이유는?

웹 서버와 데이터베이스의 경우 각각 요구 사항이 다르고, 별개의 종속성을 가지고 분리되어 운영되어야 하기 때문이다. 웹서버와 데이터 베이스 컨테이너의 주요 요구사항 예시는 아래와 같다.

컨테이너 구분컨테이너 생성 시 주요 요구사항

컨테이너 구분 컨테이너 생성 시 주요 요구사항
웹서버 컨테이너 특정 포트 사용 HTTP요청을 수신하기 위해 특정 포트를 사용해야하며, 이 포트는 컨테이너와 호스트간의 포트 매핑을 통해 호스트에서도 접근이 가능해야한다.
파일 또는 코드 공유
웹서버 컨테이너에서 실행되는 애플리케이션은 웹페이지, 이미지, 자바스크립트 파일 등의 정적 파일(정적파일은 소스코드나 그 외 파일을 의미)을 제공할 수 있음. 이러한 정적 파일은 컨테이너 내부에 저장되어 있어야 하지만, 개발자는 이 파일들을 로컬 컴퓨터에서 편집하고 디버깅할 수 있어야함. 따라서, 호스트와 컨테이너간의 디렉토리를 공유(호스트의 디렉토리를 컨테이너로 마운트하는 행위를 의미)하는 것이 필요함 - 아래 docker run 명령어를 통해 호스트 디렉토리를 컨테이너로 마운트할 수 있지만, yaml파일을 통해 docker compose up하는 경우 굳이 docker run할 필요없음(volumns로 정의해놓으면 되기 때문)

* docker run -v /path/to/host/directory:/path/to/container/directory image_name
데이터베이스 컨테이너 데이터베이스 소프트웨어 설치 데이터베이스 컨테이너에는 데이터 베이스 소프트웨어가 설치되어 있어야함(ex.MySQL, PostgreSQL, MongoDB 등)
데이터베이스 초기화 및 구성 - 데이터베이스 컨테이너 시작할 때, 데이터베이스를 초기화하고 구성해야함. - 이 과정에서 데이터베이스의 스키마와 테이블을 생성하고 초기 데이터를 적재함.
백업과 복구 - 데이터베이스 컨테이너에서는 데이터베이스의 백업과 복구 기능이 필요 - 이를 위해 데이터베이스 소프트웨어에서 제공하는 백업 및 복구 도구를 사용
데이터베이스 보안 데이터베이스 컨테이너는 중요한 데이터를 저장하므로, 보안이 중요. 따라서 암호화, 인증, 권한관리등을 통해 데이터베이스를 보호해야함. 해당 내용에 대한 정의 필요
성능 데이터베이스 실행 시 CPU, 메모리, 디스크 I/O등의 하드웨어 리소스등을 고려하여 정의 필요
확장성 데이터베이스 컨테이너는 데이터양이 증가하면 확장할 수 있어야 함. 샤딩(sharding), 레플리케이션(replication)과 같은 기술을 사용하여, 데이터베이스 확장이 가능하도록 정의

 

 

YAML?

  • 주로 파일 구성이나 데이터 전송을 위해 사용하는 파일의 한 형태로, docker에서는 해당 yaml파일 형식을 사용해서 애플리케이션의 구성요소를 정의한다.
  • 일반적으로 텍스트 파일로 저장되며, 확장자는 .yaml 또는 .yml로 사용됩니다.
  • yml파일은 들여쓰기를 통해 계층적인 데이터를 나타내며, 각 데이터 요소는 콜론(:)을 사용하여 이름과 값으로 구분됩니다.
  • 들여쓰기는 탭 또는 공백(스페이스) 2~4개 사용이 권장됨
  • Docker Compose YAML 파일 예제
    • 아래 YAML 파일은 다음과 같은 동작을 수행함
version: '3' #Compose 파일 버전을 지정합니다. 이 예제에서는 버전3을 사용합니다.
services: # 애플리케이션의 각 서비스를 정의합니다.
  web: # 웹 서버를 정의합니다.
    build: . #Dockerfile에서 이미지를 빌드합니다.
    ports: # 호스트와 컨테이너간의 포트 매핑을 정의합니다.
      - "5000:5000"
    volumes: # 호스트와 컨테이너 간의 디렉토리 매핑을 정의합니다.
      - .:/code
    links: #Redis 서비스와 연결됩니다.
      - redis
  redis: #Redis 데이터 베이스를 정의합니다.
    image: "redis:alpine" #Docker Hub에서 이미지를 가져옵니다.
  • 'docker-compose up' 명령을 실행하여 웹 서버 및 Redis 데이터베이스를 시작합니다.
  • 'web' 서비스는 현재 디렉토리에서 Dockerfile을 사용하여 이미지를 빌드하고 호스트의 5000번 포트를 컨테이너의 5000번 포트로 매핑합니다. 
  • 현재 디렉토리를 컨테이너의 code 디렉토리에 마운트합니다.
  • 'redis' 서비스는 Redis:alpine 이미지를 사용하여 컨테이너를 시작합니다.
  • 'web'서비스는 'redis'서비스와 연결됩니다.
  • 위 예제는 Docker Compose YAML 파일을 사용하여 두개의 서비스('web', 'redis')를 정의하는 방법을 보여줍니다.
  • YAML파일을 사용하여 복잡한 애플리케이션을 구성하고 실행할 수 있습니다.