도커 컴포즈 개념

도커 컴포즈란 파일 하나로 여러 컨테이너를 생성하고 폐기할 수 있도록 하는 도구입니다.

만약 도커 컴포즈가 없다면, 일일이 커맨드를 입력해야 하는데 이를 한번에 해결해주는 도구이죠.

 


도커 컴포즈 vs Docker file, Kubernetes

Dockerfile 스크립트는 이미지 만드는 용도입니다. 네트워크나 볼륨을 생성할 수 없습니다.

그러나 도커 컴포즈 파일은 컨테이너를 비롯한 네트워크나 볼륨 등 주변 환경까지 포괄합니다.

앞서 말씀드렸듯, 여러 커맨드를 입력할 필요 없이 파일 하나로 해결해낼 수 있는 것입니다.

Kubernetes는 여러 컨테이너를 관리하는 도구입니다. 따라서 생성 및 폐기를 비롯한 관리 기능이 제공됩니다.

그러나 도커 컴포즈에는 컨테이너 관리 기능이 없습니다.

 


도커 컴포즈 사용 및 작동 원리

도커 컴포즈는 도커 엔진과 사용법이 대동소이합니다. 그러나 엄연히 별개의 소프트웨어입니다. 따라서 별도 설치가 필요합니다. 다만 리눅스 환경에서만 설치가 필요할 뿐, 윈도우나 MAC OS에선 필요치 않습니다. 이유는 Docker Desktop 설치 시 함께 설치되기 때문입니다.

도커 컴포즈의 파일 형식은 YAML 파일 형식으로, "파일이름.yml" 양식을 따릅니다.

파일은 호스트에 위치하며 도커 컴포즈가 이를 읽고 대신 커맨드를 입력해주는 방식으로 작동합니다. 단, 파일은 폴더에 하나만 있어야 합니다. 만약 여러 YAML 파일이 있다면 폴더를 각각 분리해야 합니다.

 


도커 컴포즈 커맨드

YAML 파일 커맨드 주요 커맨드로는 up, down이 있습니다.

도커 컴포즈 주요 커맨드: UP

up은 YAML 파일을 읽는 명령어입니다.

docker-compose -f C:\Users\user\Desktop\study\cloud\redmine-maria\docker-compose-red-maria.yml up

up 명령어 사용 시 주의해야할 점 2가지가 있습니다. 먼저, up 명령어는 YAML 파일을 한번 읽고 나면 끝입니다. 따라서 up 실행 이후 YAML 파일을 수정하더라도 동기화되진 않습니다. 마찬가지로, YAML 파일로 생성된 컨테이너의 설정을 변경하더라도 YAML 파일에 반영되지 않습니다. 다음으로, 도커 엔진에 생성되는 컨테이너 이름은 도커 컴포즈에 명시한 service 이름과 다르다는 점입니다. 도커 엔진에 생성되는 컨테이너 이름은 "leaf 폴더명_service에 명시한 컨테이너 이름_번호"로 생성됩니다. 예를 들어, C:\Users\user\Desktop\study\cloud\wordpress-maria\docker-compose-red-maria.yml에 대해 up 커맨드를 입력한 경우 생성되는 컨테이너 이름은 "wordpress-maria-${services에 명시한 컨테이너 이름}-1" 입니다.

번호는 YAML 파일이 여러 번 실행되면, 즉 같은 구성의 컨테이너 세트가 여러 개 생성되면 넘버링 형태로 붙습니다. 

docker-compose -f C:\Users\user\Desktop\study\cloud\redmine-maria\docker-compose-red-maria.yml up --scale maria_lim=2

*근데 여러 컨테이너를 만드는 도커 컴포즈에서 의존 관계와 맞지 않게 특정 컨테이너만 여러 개 생성하면, 장애가 날 가능성이 높습니다. 여러 컨테이너가 포트번호를 공유하는 것(포트 번호 중복)도 장애를 야기할 수 있습니다. 따라서 여러 세트의 컨테이너를 생성하는 경우 쿠버네티스 활용을 권장합니다.

 

도커 컴포즈 주요 커맨드: DOWN

down은 YAML로 실행된 컨테이너, 네트워크를 폐기하는 명령어입니다.

down 명령어에서 중요한 건 image와 volume은 삭제되지 않는다는 점입니다. 따라서 별도 폐기 작업이 필요합니다.

docker-compose -f C:\Users\user\Desktop\study\cloud\redmine-maria\docker-compose-red-maria.yml down

 

 


도커 컴포즈 파일 양식 및 예제

양식

version: "${버전}"

services:
  ${컨테이너 이름}:
    depend_on:
      - ${의존 컨테이너 이름}
    image: ${이미지 이름}
    networks:
      - ${네트워크 이름}
    ports:
      - ${클라이언트 요청하는 포트}:${리다이렉트되는 포트}
    restart: ${컨테이너 재시작 여부}
    #restart 설정 값: no, always, on-failure, unless-stopped
    environment:
      ${환경변수 이름}=${환경변수 값}

networks:
  ${네트워크 이름}:

volumes:
  ${볼륨 이름}:

 


mysql+wordpress

version: "3"

services:
  mysql000ex11:
    image: mysql
    networks:
      - wordpress000net1
    volumes:
      - mysql000vol11:/var/lib/mysql
    restart: always
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: wordpress000db
      MYSQL_USER: wordpress000kun
      MYSQL_PASSWORD: wkunpass
  wordpress000ex12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    volumes:
      - wordpress000vol12:/var/www/html
    ports:
      - 8085:80
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: wordpress000db
      MYSQL_USER: wordpress000kun
      MYSQL_PASSWORD: wkunpass

networks:
  wordpress000net1:

volumes:
  mysql000vol11:
  wordpress000vol12:

 

 

 


mysql+redmine

version: "1"

services:
  cloudlim_mysql:
    image: mysql
    networks:
      - cloudlim_net
    volumes:
      - cloudlim_vol1:/var/lib/mysql
    restart: always
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: cloudlimdatabase
      MYSQL_USER: cloudlim
      MYSQL_PASSWORD: limlim1234
  cloudlim_redmine:
    depends_on:
      - cloudlim_mysql
    image: redmine
    networks:
      - cloudlim_net
    volumes:
      - cloudlim_vol2:/usr/src/redmine/files
    ports:
      - 8086:3000
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: cloudlimdatabase
      MYSQL_USER: cloudlim
      MYSQL_PASSWORD: limlim1234

networks:
  cloudlim_net:

volumes:
  cloudlim_vol1:
  cloudlim_vol2:


 

mariadb+redmine

version: "2"

services:
  maria_lim:
    image: mariadb
    networks:
      - net_lim
    volumes:
      - vol_lim1:/var/lib/mysql
    restart: always
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: mariarootpw
      MYSQL_DATABASE: limdb
      MYSQL_USER: cloudlim
      MYSQL_PASSWORD: lim1234
  cloudlim_redmine:
    depends_on:
      - maria_lim
    image: redmine
    networks:
      - net_lim
    volumes:
      - vol_lim2:/usr/src/redmine/files
    ports:
      - 8087:3000
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: mariarootpw
      MYSQL_DATABASE: limdb
      MYSQL_USER: cloudlim
      MYSQL_PASSWORD: lim1234

networks:
  net_lim:

volumes:
  vol_lim1:
  vol_lim2:

 


 

출처

 

그림과 실습으로 배우는 도커 & 쿠버네티스 - 예스24

컨테이너나 도커를 도통 이해하기 어려운 분들을 위한 본격 도커 입문서!이 책은 컨테이너 기술이 어렵게 느껴지는 엔지니어나 백엔드 기술에 자신이 없는 분들을 위한 도커 입문서다. 자세한

www.yes24.com

 

 

+ Recent posts