Docker Compose

Docker Compose는 여러 컨테이너로 구성된 애플리케이션을 정의하고 실행하기 위한 도구입니다. 이를 통해 개발부터 배포까지 더 효율적인 환경을 구축할 수 있습니다. Compose를 사용하면 서비스, 네트워크, 볼륨 등을 하나의 이해하기 쉬운 YAML 설정 파일로 관리할 수 있습니다. 덕분에 애플리케이션이 사용하는 전체 기술 스택을 간편하게 정의하고, 단 한 번의 명령으로 설정 파일에 명시된 모든 서비스를 생성·실행할 수 있습니다.

Docker Compose는 Production, Staging, Development, Test, CI Workflow 등 모든 환경에서 동작합니다. 또한 애플리케이션의 전체 라이프사이클을 관리할 수 있는 명령들도 제공합니다.

docker-compose.yml

docker-compose 명령은 기본적으로 현재 경로를 기준으로 docker-compose.yml 파일을 찾아 실행합니다.
따라서 이 파일에 관리할 서비스들의 정보를 정의하고, 각 서비스별로 필요한 설정을 하위에 작성해야 합니다.

version: '3.7'  
  
services:  
  mysql-rdb:                                                  # Service Name 명시 (자유롭게)  
    image: mysql:8-oracle                                     # Container 를 생성하기 위한 Base Image 를 명시 (Value 를 자유롭게)  
    container_name: mysql-rdb                                 # 실핼될 Container 의 이름을 명시 (Value 를 자유롭게)  
    restart: always                                           # docker compose restart 와 같은 명시적인 작업으로으로 인해 재시작될 경우, redis-cache 라는 서비스도 항상 재실행하겠다는 의미.  
    ports:                                                    # Host 와 Container 의 Port 를 연결  
      - '9905:3306'  
    command:                                                  # Container 가 시작 시점에 수행할 명령을 지정 (여기서는 옵션)  
      - --character-set-server=utf8mb4  
      - --collation-server=utf8mb4_unicode_ci  
    environment:                                              # mysql:8-oracle 에서 사용할 수 있는 Environment 값들을 하위에 명시  
      MYSQL_DATABASE: testdb  
      MYSQL_USER: testuser  
      MYSQL_PASSWORD: 1234  
      MYSQL_ROOT_PASSWORD: 1234  
    healthcheck:                                              # 서비스 Container 가 정상인지 확인할 수 있는 설정들을 하위에 명시  
      test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ] # 서비스 Container 가 정상인지 확인할 수 있는 명령을 명시
      timeout: 20s                                            # healthcheck 시간 제한을 설정하는 데 사용. 20초를 초과하면 해당 검사는 실패로 간주  
      retries: 10                                             # healthcheck 가 연속으로 10번 실패할 때만 컨테이너를 비정상 상태로 간주하거나, 재시작 정책을 실행.  
  
  redis-cache:  
    image: redis:latest  
    container_name: redis-cache  
    restart: always  
    ports:  
      - '9906:6379'  
    depends_on:                                               # 서비스 실행순서를 정의할 수 있는 설정.  
      mysql-rdb:                                              # mysql-rdb 이라는 서비스가  
        condition: service_healthy                            # service_healthy(healthcheck 의 결과) 이면 redis-cache 서비스를 실행. 

이해가 다소 어려울 수 있는 설정으로는 restarts, healthcheck, condition 등이 있습니다. 각 설정의 의미를 정리하면 아래와 같습니다.

restarts

  • no(기본값) : 컨테이너가 종료되면 재시작하지 않습니다.
  • always : 컨테이너가 종료되면 항상 재시작합니다. 수동으로 중지한 경우에도 다시 시작됩니다.
  • on-failure : 컨테이너가 비정상 종료(0이 아닌 종료 코드)될 때만 재시작합니다. 정상 종료(코드 0)일 경우에는 재시작하지 않습니다.
  • unless-stopped : 컨테이너가 종료되면 항상 재시작하지만, 사용자가 명시적으로 중지한 경우에는 재시작하지 않습니다.

healthcheck:test

  • [‘argv1’, ‘argv2’] 와 같이 healthcheck를 수행하는 배열의 값에는 항상 NONE 혹은 CMD 혹은 CMD-SHELL이 와야 합니다.
  • [ “CMD”, “mysqladmin”, “ping”, “-h”, “localhost” ] 와 **[ “CMD-SHELL”, “mysqladmin ping -h localhost” ]**는 동일합니다.

depends_on:name:condition

  • service_started : 서비스가 정상적으로 시작되었음을 나타내는 상태입니다. 모든 초기화 작업이나 healthcheck가 완료되지 않았더라도, 서비스 실행이 시작된 상태를 의미합니다.
  • service_healthy : 서비스가 정상적으로 실행 중이며 healthcheck에도 성공한 상태입니다.
  • service_completed_successfully : 서비스가 할당된 작업을 성공적으로 마쳤고, 더 이상 실행할 필요가 없는 상태입니다.
  • 더 자세한 내용 공식문서1, 공식문서2

Execute Docker Compose

docker-compose up 으로 YML 에 작성한 서비스들을 한번에 실행할 수 있습니다. docker-compose 명령어는 기본적으로 현재 Pathd세ㅓ docker-compose.yml 파일을 찾아 실행합니다.

docker-compose 는 예전 방식입니다. docker-compose 가 없다면, 하이폰 없는 docker compose 로 실행해보시기 바랍니다.

docker-compose up

하지만 상단의 명령은 터미널을 빠져나오지 못하고 계속 점유하고 있는 상태가 되기 때문에, -d (Detach Mode) 옵션을 주어 컨테이너가 백그라운드에서 실행되도록 할 수 있습니다.

docker-compose up -d

앞서 healthcheck로 설정으로 mysql-rdb 헬스체크 후, depends-on 설정으로 redis-cache 가 실행되도록 순서를 지정해주었기 때문에, mysql, redis 순으로 컨테이너가 올라가는것을 확인할 수 있습니다.

하지만 docker-compose.yml 이 꼭 프로젝트 루트에 있다는 보장이 없습니다. 그럴때는 -f 옵션을 통해 실행할 docker-compose.yml 파일을 명시해줄 수 있습니다.

docker-compose -f Docker/docker-compose.yml up -d 

번외로 docker-compose.yml 에 명시한 서비스들 중 특정 서비스 혹은 특정한 여러개의 서비스를 실행시키고 싶다면 뒤에 서비스 이름을 명시해주면 됩니다.

docker-compose up mysql-rdb -d 
docker-compose up service1 service2 service3 -d

Terminate Docker Compose

docker-compose down 으로 실행되고 있는 컨테이너들을 모두 종료시키거나 특정 컨테이너만 종료시킬 수 있습니다.

docker-compose down

특정 컨테이너만 혹은 2개 이상의 컨테이너를 종료시키고 싶을때는 down 뒤에 서비스 이름들을 명시하면 됩니다.

docker-compose down mysql-rdb redis-cache

마찬가지로 다른 폴더에 있는 docker-compose 를 통해 컨테이너를 종료시키고 싶을때는 -f 옵션을 사용할 수 있습니다.

docker-compose -f Docker/docker-compose.yml down mysql-rdb redis-cache

Restart Docker Compose

컨테이너의 재시작은 docker-compose restart 로 수행할 수 있습니다.

docker-compose -f Docker/docker-compose.yml restart

Reference

Docker Compose