본문 바로가기
[스파르타코딩클럽]/Docker & CICD

Docker Compose

by 진진리 2024. 3. 19.
728x90

Docker Compose 사용 이유

  • 편하게 설정: 여러 컨테이너를 한 번에 쉽게 설정 가능
  • 자동 배포: 설정 파일이 있으면 Docker Compose가 알아서 컨테이너들을 만들어 주고 실행
  • 의존성 관리: 컨테이너들이 서로 의존하는 관계 관리
  • 모니터링과 로깅
  • 확장성: 여러 컨테이너를 하나의 그룹으로 관리하고 확장하기 쉬움
  • 유연성: 개발 환경, 테스트 환경, 실제 운영 환경에서도 같은 설정 파일을 써서 일관성을 유지 가능
  • 보안 강화: 컨테이너들의 네트워크를 분리해서 외부로부터의 접근을 제한
  • 유지보수가 쉬워요: 설정 파일 하나로 컨테이너들을 관리하기 때문에 파일만 수정하면 됨

 

Docker Compose 사용 환경

  • 개발 환경에서
    • 앱을 따로 떼어 놓고 실행하고 테스트할 수 있는 환경
    • Compose 파일은 앱이 필요로 하는 모든 서비스들(데이터베이스, 큐, 캐시, 웹 API 등)을 정리해주고, docker compose up 명령어로 이 모든 것을 한 번에 시작
  • 자동화된 테스트 환경에서
    • 테스트를 위한 별도의 환경을 쉽게 만들고 없앨 수 있음
    • 예시: docker compose up -d ./run_tests docker compose down
  • 단일 호스트 배포에서
    • 실제로 앱을 운영하는 환경(프로덕션)에도 사용 가능

 

YAML file이란?

YAML( YAML Ain't Markup Language) 파일: 컴퓨터가 읽을 수 있는 설정 파일

사람이 읽기에도 쉬운 텍스트 형식으로 되어 있음

 

  • 사용 이유
    • YAML 파일은 설정을 정리하고 관리하기에 좋음
    • YAML은 읽기 쉽고, 쓰기도 간단해서 많은 프로그램과 도구에서 선호하는 설정 파일 형식
  • 특징
    • YAML 파일은 구조가 명확하고 간단해서, 사람이 보기에도 이해하기 쉬워요
    • 들여쓰기를 사용해서 각 설정의 관계를 나타냄
  • 문법
    • 키-값 쌍: 키와 값으로 이루어진 쌍으로 구성. 키와 값은 콜론(:)으로 구분.
    • 리스트: 쉼표(,)로 구분된 값들의 리스트로 구성.
    • 딕셔너리: 중괄호({})로 둘러싸인 키-값 쌍의 리스트로 구성.
    • 불린 값: true, false, yes, no 등의 값으로 표현.
    • 문자열: 큰 따옴표("")나 작은 따옴표('')로 둘러싸인 문자열로 표현.

 

Docker Compose 파일 예제

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./web:/usr/share/nginx/html
    depends_on:
      - api
    links:
      - api:api
  api:
    image: java:latest
    volumes:
      - ./api:/app
    ports:
      - 8080:8080
    environment:
      - REDIS_HOST=redis
      - MYSQL_HOST=mysql
      - MYSQL_USER=root
      - MYSQL_PASSWORD=password
      - MYSQL_DATABASE=test
    depends_on:
      - mysql
      - redis
    links:
      - mysql:mysql
      - redis:redis
  redis:
    image: redis:latest
    ports:
      - 6379:6379
  mysql:
    image: mysql:latest
    ports:
      - 3306:3306
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=test
      - MYSQL_USER=root
      - MYSQL_PASSWORD=password

 

  • version: Docker Compose의 버전을 정의
  • services
    • web 서비스는 Nginx 이미지를 사용하며, 포트 80번을 호스트 머신에 노출
    • api 서비스는 Java 이미지를 사용하며, 포트 8080번을 호스트 머신에 노출
    • redis 서비스는 Redis 이미지를 사용하며, 포트 6379번을 호스트 머신에 노출
    • mysql 서비스는 MySQL 이미지를 사용하며 포트 3306번을 호스트 머신에 노출
services:
  web:
    build:
      context: .    # Dockerfile 의 위치
      dockerfile: Dockerfile    # Dockerfile 파일명
    container_name: testapp_web_1    # 생략하는 경우 
    # 자동으로 부여 docker run 의 --name 옵션과 동일
    ports: "8080:8080"  # docker run 의 -p 옵션과 동일
    expose: "8080"    # 호스트머신과 연결이 아니라 
    # 링크로 연결된 서비스 간 통신이 필요할 때 사용
    networks: testnetwork    # networks 를 최상위에 정의한다면 해당 이름을 사용
    # docker run의 --net 옵션과 동일
    volumes: .:/var/lib/nginx/html    # docker run 의 -v 옵션과 동일
    environment:
      - APPENV=TEST    # docker run 의 -e옵션과 동일
    command: npm start   # docker run 의 가장 마지막
    restart: always    # docker run 의 --restart 옵션과 동일
    depends_on: db    # 이 옵션에 지정된 서비스가 시작된 이후에 `web`서비스가 실행
    links: db # Docker가 네트워크를 통해 컨테이너를 연결하도록 정의합니다. 
    # 컨테이너를 연결할 때 Docker는 환경 변수를 만들고 
    # 컨테이너를 알려진 호스트 목록에 추가하여 서로를 검색할 수 있도록 합니다.
    deploy:    # 서비스의 복제본 개수 등 지정
      replicas: 3
      mode: replicated
  • volumes:  현재 디렉토리 내 web/api/mysql 디렉토리를 컨테이너에 연결하여 데이터를 영구적으로 저장
    • 도커 볼륨 혹은 호스트 볼륨을 마운트하여 사용
    • 선언된 볼륨만 docker-compose.yml에서 사용 가능
  • depends_on: 각 서비스 간의 의존성을 정의
  • links: 각 서비스 간의 링크를 정의
  • networks: 서비스(컨테이너)가 소속된 네트워크
    • 따로 지정하지 않을 경우 default_${project}와 같이 지정됨
    • 기본적으로 컨테이너는 같은 네트워크에 있어야 서로 통신이 가능함
  • healthcheck
    • 서비스 컨테이너가 "healthy"한지 계속 체크
    • Dockerfile에 정의된 것을 먼저 따르지만 docker-compose 파일에서 재지정 가능
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s
  start_interval: 5s

 

 

Docker Compose CLI

  • docker-compose [COMMAND] [SERVICES...] : 지정된 서비스(컨테이너)만 제어 가능
  • docker-compose up
    • --build : 이미 빌드가 되었더라도 강제로 빌드를 진행합니다.
    • -d : 백그라운드로 실행합니다.
    • --force-recreate : 강제로 컨테이너를 종료했다가 재생성
  • docker-compose down : 서비스를 멈추고 삭제. 컨테이너와 네트워크를 삭제.
    • --volume : 선언된 도커 볼륨도 삭제합니다.
  • docker-compose stop, docker-compose start : 서비스를 멈추거나, 멈춰 있는 서비스를 시작
  • docker-compose ps : 현재 환경에서 실행 중인 각 서비스의 상태를 표시합니다.
  • docker-compose logs : 컨테이너 로그를 확인합니다.
    • -f : 컨테이너 로그를 실시간으로 확인
  • docker-compose exec [명령어] : 실행 중인 컨테이너에 해당 명령어를 실행합니다.
  • docker-compose run
    • 특정 명령어를 일회성으로 실행하지만 컨테이너를 batch성 작업으로 사용하는 경우에 해당
    • 컨테이너를 기동시키고 특정 명령어를 실행이 완료된 후에 컨테이너를 종료

 

  •  

'[스파르타코딩클럽] > Docker & CICD' 카테고리의 다른 글

Docker volume  (0) 2024.03.19
Docker 모니터링&로깅  (0) 2024.03.19
Dockerfile  (0) 2024.03.18
Github Actions와 CI/CD  (0) 2024.03.18
CI/CD와 Docker  (0) 2024.03.18