DevOps/도커 (Docker)

[Docker] - 005. Docker Compose 활용하기

귀찮은 개발자 2024. 5. 4. 00:47

Docker Run 을 사용하여 Container 실행이 가능하다.

예를 들어   docker run -it ubuntu bash  을 아래와 같이  docker-compose.yml  으로 작성할 수 있다. 

version: '3.8'

services:
  ubuntu:
    image: ubuntu

 

Docker Compose 가 없다면, Make 파일을 사용하여 Docker run CLI 을 코드로 기록할 수 있지만, Docker Compose 을 통해 network, option 등을 쉽게 관리할 수 있다. 

 

그렇다면 Docker Compose 는 무엇인가?

도커 컴포즈(Docker Compose) 란? 

멀티 컨테이너 도커 애플리케이션을 코드로 정의하고 실행하기 위한 도구이다. 이를 통해 여러 컨테이너를 단일 환경에서 정의하고 실행할 수 있으며, 개발, 테스트, 배포 환경에서 애플리케이션을 관리하는 데 사용된다. 
도커 컴포즈는 YAML 을 사용하여 네트워크, 볼륨 등을 정의할 수 있으며, Docker Swarm 과 Kubernetes 와 함께 사용도 가능하다. 

도커 컴포즈의 장점

  • 이미지, 환경변수, 네트워크, 볼륨 등의 정보를 YAML 파일로 작성하여 코드로 관리
  • 간단한 명령어 로 컨테이너 실행  (docker-compose up -d) 
  • 하나의 YAML 파일로 여러 환경에 배포 (개발, 테스트, 운영 환경 등)
  • 컨테이너 인스턴스 관리 
  • 하나의 YAML 파일로 서로 다른 컨테이너 관리 
  • 컨테이너 오케스트레이션 툴과 함께 사용 가능 (Swarm, Kubernetes)
  • 도커 컴포즈에 있는 서비스들은 동일한 하나의 네트워크에 연결됨 

docker-compose 설치하기

 docker-compose  는 기본적으로 설치되어 있지 않기 때문에 별도로 설치해야 한다. 

하지만  docker compose  옵션이 있다면 이를 통해 docker-compose.yml 파일을 실행할 수 있다. 

https://docs.docker.com/compose/install/linux/#install-the-plugin-manually

 

Install the Compose plugin

Download and install Docker Compose on Linux with this step-by-step handbook. This plugin can be installed manually or by using a repository.

docs.docker.com

내가 docker 을 사용했을 땐 docker-compose 을 사용했는데, 요즘 개발을 시작한 친구들은 docker compose 을 사용하고 있었다.. 

 

위의 터미널은 rocky os 에서 docker register 를 등록하여 docker 을 설치했고,

아래의 터미널은 기본 ubuntu register 을 이용하여 docker 을 설치했다. 

docker-compose.yml 에서 자주 사용하는 옵션

아래 옵션 외에도 많은 옵션을 사용하지만, 아래의 옵션만 알고 있어도 충분하다고 본다. 

  • version: 도커 컴포즈 버전으로 지원하는 옵션들이 약간 차이가 있음
  • services: 컨테이너 정의 
  • build: 도커 이미지를 빌드하기 위한 경로, Dockerfile 의 경로, URL 또는 context, dockerfile 등의 옵션 작성 가능
  • context: 상대 경로로 시작할 위치  
  • dockerfile : 도커 파일의 경로 
  • container_name : 컨테이너를 가르키는 별칭으로 localhost 처럼 호스트 주소로 사용 가능 
  • image: 컨테이너를 실행할 이미지 
  • command: 컨테이너가 시작될 때 실행할 명령어, Dockerfile 의 CMD를 오버라이드함 
  • ports: 포트 포워딩하여 호스트와 컨테이너 간에 포트를 매핑, 프로토콜(tcp/udp)도 입력할 수 있음 
  • expose: 컨테이너가 내부적으로 열어두는 포트를 지정, 외부에 노출되지 않으며 같은 네트워크에 있는 다른 서비스들과 연결
  • environment: 컨테이너 내부에서 사용할 환경 변수 지정, key=value 또는 .env 파일 참조 가능 
  • env_file: 환경 변수 파일 경로 지정
  • depends_on: 서비스 간에 의존성 지정, depends_on 옵션에 명시된 서비스가 실행된 후 실행됨
  • volumes: 호스트와 컨테이너 간에 볼륨을 마운트, 읽기 전용(read-only) 옵션도 추가 가능
  • networks: 컨테이너 네트워크 지정, networks 옵션을 사용하여 여러 개의 네트워크를 생성하고 컨테이너에 할당 가능 
  • links: 컨테이너 간의 링크 생성. 링크된 컨테이너는 서로 호스트 이름으로 접근할 수 있음. 네트워크 옵션과 함께 사용 가능 
  • healthcheck: 컨테이너의 실행 상태를 검사하는 방법을 지정. test, interval, timeout, retries 등의 옵션이 있음 
  • restart: 컨테이너가 종료될 때 재시작 정책을 지정. no, always, on-failure, unless-stopped 중 1가지를 선택 해야함 

healthcheck 설명 

  • interval: 확인 간격 시간 (10초 간격으로 체크함)
  • timeout: 응답 대기 시간으로 시간 초과 시 죽은걸로 봄 (5초)
  • retries: 컨테이너가 비정상으로 플래그 지정되기 전 허용되는 연속 실패 횟수 (3회)
  • start_period: 상태 확인을 실행하기 전에 앱에 약간의 시작 시간을 줄 수 있는 상태 확인을 트리거하기 전에 기다리는 시간
더보기
version: '3.8'

services:
  nginx:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 5s

restart 설명  

  • no: 재시작하지 않음 
  • always: 항상 재시작
  • on-failure: 프로세스가 0 외 의 상태로 종료되면 재시작 
  • unless-stopped: 종료 시 재시작하지 않으며 그 외에는 재시작

services 외에 정의 가능한 것

config, secrets 은 Docker Swarm 에서 쓰인다. 

  • volumes: 컨테이너에서 사용할 볼륨 정의
  • networks: 컨테이너에서 사용할 네트워크 정의
  • configs: 컨테이너에서 사용할 config 정의하며, config는 기본적으로 컨테이너 내부의 /<config-name>에 마운트 되며 애플리케이션의 설정 파일을 관리하고 암호화된 형태로 전달할 수 있음 
  • secrets: 컨테이너에서 사용할 secret 정보를 정의하며 민감한 정보를 안전하게 보관하고 전달하는데 사용되며 암호, API 키, 인증 토큰 등과 같이 민감한 정보를 안전하게 관리함 

Docker Compose 명령어

  • docker-compose up : 모든 서비스 실행
  • docker-compose up -d : 백그라운드에서 모든 서비스 실행
  • docker-compose up service1 service2 : 특정 서비스만 실행
  • docker-compose down : 모든 서비스 중지하고 제거
  • docker-compose stop : 모든 서비스 중지
  • docker-compose start : 모든 서비스 시작
  • docker-compose restart : 모든 서비스 재시작하기
  • docker-compose pause : 모든 서비스 일시 정지
  • docker-compose unpause : 일시 중지된 서비스 다시 시작
  • docker-compose ps : 현재 실행중인 서비스 상태 확인
  • docker-compose logs : 서비스 로그 확인하기
  • docker-compose config : YAML 파일의 설정 확인