DevOps/Docker

[Docker] Docker-compose란? (작동 구조, yaml 구성)

yubi5050 2022. 8. 17. 14:23

Docker-compose 사용 이유

하나의 어플리케이션을 동작하기 위해 여러 컨테이너 기반 서비스가 실행 되어야 함

컨테이너 간 의존성, 네트워크, 볼륨 등을 정의하며 컨테이너를 순차적으로 생성 할 필요 존재

 

Docker-compose 작동 구조

Docker-compose 파일은 yaml 형태로 작성, 각 컨테이너의 Dockerfile들을 순차적으로 실행

 

 

Docker-compose 작동 구조

 

 

Docker-compose yaml 파일 구성

Docker Compose 주요 항목


📁 1. 버전 정의

  • Version: ‘3.0’ : YAML 파일의 버전 
  • ex) version : "3.5"

 

📁 2. 서비스 정의

큰 서비스 목록 (services) 아래의 서비스 들 존재. 

  • Image : 서비스의 컨테이너 생성 이미지
  • build : 서비스의 컨테이너 Dockerfile 기반 빌드용 이미지 path 지정 (yml 파일 위치부터 relative path)
  • depends_on : 서비스의 특정 컨테이너 의존 관계 명시 (명시 항목 우선 실행)
  • labels : 메타 데이터 추가
  • container_name : 서비스 내 컨테이너 이름
  • networks : 서비스 네트워크 설정
  • volumes : 서비스 볼륨 설정 
  • volumes_from : 다른 서비스(컨테이너)의 모든 볼륨 마운트
  • environment : 서비스의 내부 컨테이너에서 사용할 환경변수 (ex. name:value , -name=value)
  • env_file : 서비스의 내부 컨테이너에서 사용할 환경변수 파일로부터 추가
  • command : 서비스 컨테이너가 실행될 때 수행 명령어 (디폴트 command를 덮어씀)
  • ports : 서비스의 개방 포트
  • expose : 호스트 머신상에만 포트 노출. 링크된 서비스만 엑세스 가능
  • Links : 컨테이너를 다른 서비스에 링크함 (유사 external_links , compose 밖 서비스에 링크)
  • extra_hosts : 호스트명의 맵핑 추가 (docker의 --add-host 옵션과 동일, /etc/hosts에 추가됨)
  • extends : 현재 파일을 다른 서비스 파일(.yaml) 의 옵션으로 설정을 덮는 것
  • log_driver : 로그 기록용 드라이버 지정
  • dns : dns 서버 설정 (ex. dns:8.8.8.8)
  • dns_search : DNS의 Search 도메인 설정 (ex. webexample.com)

 

예시 ex) 

services:
  service_a:
    image : img1:latest
    container_name : con_a
    networks:
      - all_network1
    volumes:
      - all_volume1:/share
    ports:
      - 80:8000
      - 5432:5432
    environment:
      - PUBLIC_KEY=1234
  service_b:
    image : img2:latest
    container_name : con_b
    networks:
      - all_network1
    volumes_from:
      - service_a
    ports:
      - 3306:3306
    depends_on:
      - service_a
    environment:
      PRIVATE_KEY:4321

 

📁 3. 기타 docker run과 같은 옵션들  

  • working_dir : 작업중인 디렉토리 이동 (=cd)
  • entrypoint : 컨테이너 생성시 실행되는 명령어
  • memlit : 메모리 제한
  • privileged : 시스템 내 주요 자원에 접근하기 위해 도커 컨테이너를 권한 모드(privileged 모드)로 실행하는 것
  • restart : 재시작
  • tty : 터미널 입력 대기 상태로 유지하기 (기본적으로 터미널 인터랙티브 입력이 없다는 상황을 가정하여 프로세스가 바로 종료 되기 때문)

 

services:
  service_a:
    image : img1:latest
    container_name : con_a
    working_dir : /be
    entrypoint: /be/start.sh
    mem_limit: 10000000
	privileged: true
    restart: always
    tty: true

 

 

📁 4. 네트워크 및 볼륨 정의

Docker compose는 기본적으로 실행시 하나의 default network에 모든 container를 연결하며, default network의 이름은 yml이 위치한 디렉토리 이름 뒤에 _default가 붙게 됨. (ex. yaml위치한 디렉토리 이름이 my_temp라면 network이름은 my_temp_default가 됨)

 

네트워크

  • driver : 기본 브리지 타입의 네트워크 생성
  • Ipam : IP Address Mananger를 위해 사용하며, subnet, ip 범위 등 설정 가능
  • External : 새로운 네트워크를 생성하는 것이 아닌 기존의 네트워크를 사용하게 하는 것 

 

볼륨

  • External : volume, volumes-from 등을 사용하여 프로젝트마다 볼륨을 사용 및 연결
  • 새로운 볼륨을 사용하는 것이 아닌 기존의 볼륨을 사용하게 되는 것

 

services:
  service_a:
    image : img1:latest
    container_name : con_a
    networks:
      - all_network1
    volumes:
      - all_volume1:/share
networks:
  my_network_all:
    driver: overlay
    driver_opts:
      subnt: "255.255.255.0"
      IDAdress: "10.0.0.2"
volumes:
  my_volume:
    driver: flocker
    driver_opts: