티스토리 뷰

Infra

docker-compose 에 대한 소개 및 사용법

빛의기도 2024. 8. 28. 09:59
docker-compose

 
Docker가 설치/제거 및 사용이 간편하죠. 무엇보다 프로그램을 설치 하고 제거 하면 남는 찌꺼기 및 실행 과정에서 생성되는 쓰레기 파일들이 container 내에서 생성되고, container를 삭제하면 깔끔하게 정리되는게 저는 좋더라구요.
물론 퍼포먼스도 좋고...
 
Docker가 뭐지? 어떻게 쓰는겨? (tistory.com)

Docker가 뭐지? 어떻게 쓰는겨?

A. 개요1. Docker 가 뭐지?도커(Docker)는 애플리케이션을 컨테이너라는 단위로 패키징하여 배포, 실행, 관리할 수 있게 해주는 오픈 소스 플랫폼이다.컨테이너는 애플리케이션과 그 실행 환경을 함

tack0829.tistory.com

 
 
Docker를 사용하는 이유야 다양하겠지만 저는 redis, postgresql등을 필요할때 마다 띄워서 사용하고 있습니다.
사양이 좋지 못하니 disk에 volume을 생성할 공간을 하나 만들어 두고, container에 volume을 binding 해서 stable 하게 사용하고, 필요 없을 때는 내려서 리소스를 확보 하는 방식으로 사용하고 있어요.
 
그러다 보니 매번 띄우는 설정을 기억하고 있어야 하고, 또 container가 많아지만 골치가 아파지더라구요.
그래서 orchestration 도구들 중에 docker-compose를 가장 많이 사용하는 듯 싶습니다.
자주 사용하는 container 설정을 docker-compose.yaml 에 정의 해 두고 docker-compose up 이나 docker-compose down 으로 올리고 내리기만 하면 되니까요.
저 혼자 사용할때는 이만한게 없더라구요.
 
그래서 docker-compose에 대한 소개 및 사용방법을 하려 합니다.
 
 
Docker Compose overview | Docker Docs

Docker Compose overview

Learn how to use Docker Compose to define and run multi-container applications with this detailed introduction to the tool.

docs.docker.com

 


A. Docker Compose란?

도커 컴포즈(Docker Compose)는 여러 개의 도커 컨테이너를 한 번에 관리하는 도구입니다. 여러 컨테이너를 하나의 애플리케이션으로 묶어서 실행하고 관리할 수 있도록 도와줍니다. 이를 통해 여러 애플리케이션을 의존성 있게 구성하고 실행할 수 있습니다.
 
도커 컴포즈의 주요 기능은...
 

  • YAML 파일로 설정 관리
    도커 컴포즈는 YAML 파일을 사용하여 서비스, 네트워크, 볼륨 등을 설정하고 관리합니다.
    이를 통해 설정을 코드로 관리할 수 있습니다.
    그래서 매번 기억할 필요가 없어요.
  • 여러 컨테이너 관리
    여러 개의 컨테이너를 하나의 그룹으로 묶어 관리할 수 있습니다.
    예를 들어 웹 애플리케이션과 데이터베이스를 함께 실행하고 관리할 수 있습니다.
    그리고 depends_on 이라는 키워드로 종속관계를 설정 할 수도 있습니다.
    쉽게 말해서 container간에 기동 순서를 정할 수 있죠.

  • 간편한 실행 및 정지
    yaml로 정의된 script만 있으면 docker-compose up 명령으로 컨테이너 그룹을 실행하고, docker-compose down 명령으로 정지할 수 있습니다. 아주 편리하죠...
    물론 상황에 따라 여러 yaml을 만들어 둘 수 있고, docker-compose -f {yaml파일명}과 같이 파일명을 지정해서도 실행 가능 합니다.

  • 스케일링
    스케일링은 복제본을 몇개나 만드냐 라는 의미입니다. 즉, 동일한 container를 여러개 복제해서 실행 할 수 있다는 뜻이죠. 놀랍죠?

 
오케스트레이션 도구는 이런 이유들 때문에 사용 합니다.
docker 명령만으로도 할 수는 있지만, 관리가 너무 어렵죠...
 
 


B. 사용 예시

 
앞에서 말씀 드렸듯이 사용방법 자체는 굉장히 간단 합니다.
 

  • 기동
docker compose up

 

  • 정지
docker compose down

 
 
이 명령들을 사용하기 위해서는 docker-compose.yaml을 작성하는 방법을 알아야 합니다.
docker 사이트에 있는 compose 사용 예시를 통해 좀 더 자세히 살펴보겠습니다.
 
https://docs.docker.com/compose/compose-application-model/#illustrative-example

How Compose works

Understand how Compose works and the Compose application model with an illustrative example

docs.docker.com

 
위 링크를 따라가 보시면 docker compose의 예시를 설명 하고 있습니다.
저는 여기에서 해당 링크의 내용을 인용해서 설명 해 드리려 합니다.
 
 


1. 구성도 예시

예시로 사용될 인프라 구성도
예시로 사용될 인프라 구성도

Front와 Backend가 분리되어 있고, Backend에는 PV가 RW모드로 붙어 있습니다.
 
Front와 Backend 두 서비스 모두 격리된 백티어 네트워크에서 서로 통신하는
반면 프런트엔드는 프런트티어 네트워크에도 연결되어 있으며 외부 사용을 위해 포트 443을 노출합니다.
 
Front는 HTTPS구성이 되어서 443으로 외부 사용자가 접근할 수 있는 구성이네요.
이 인증서를 Secret으로 등록하고 Front에 인증서를 주입(설정?) 해 줘야 할거 같습니다.
 
(Injected를 번역할 마땅한 단어가 떠오르지 않네요... 주입? 연결?;;; 둘다 사용하긴 합니다만, 글로 쓰니까 어색함이..;;)
 
 
예제 애플리케이션은 다음 부분으로 구성됩니다.

  • Docker 이미지로 지원되는 2가지 서비스: webapp 및 데이터베이스
  • Secret(HTTPS 인증서) 1개 (프런트엔드에 Injected 됨)
  • 개의 HTTP 구성, (프런트엔드에 Injected 됨)
  • 백엔드에 연결된 영구 볼륨 1개
  • 네트워크 2개

2. docker-compose.yaml 예시

사용은 현재 안됩니다.(example/webapp, example/database 가 없는 이미지에요..^^;;)
그저 구조를 보시고 이해 하시는데 도움이 되시길 바랍니다.
 
(https://docs.docker.com/compose/compose-application-model/#illustrative-example

services:
  frontend:
    image: example/webapp
    ports:
      - "443:8043"
    networks:
      - front-tier
      - back-tier
    configs:
      - httpd-config
    secrets:
      - server-certificate

  backend:
    image: example/database
    volumes:
      - db-data:/etc/data
    networks:
      - back-tier

volumes:
  db-data:
    driver: flocker
    driver_opts:
      size: "10GiB"

configs:
  httpd-config:
    external: true

secrets:
  server-certificate:
    external: true

networks:
  # The presence of these objects is sufficient to define them
  front-tier: {}
  back-tier: {}

 
이렇게 정의 될 수 있을 거 같습니다.
 
 
만약, 정상 기동이 된다면, 아래처럼 확인이 가능합니다.

docker compose 실행된 서비스 조회

 
 


 

C. 설치 방법

 
설치는 docker-compose 라는 cli를 받아서 사용하는 방법과, docker의 docker-compose plugin을 받아서 docker의  compose 옵션을 통해 사용하는 방법 2가지가 있습니다.
 

1. docker compose plugin으로 설치하기

https://docs.docker.com/compose/install/linux/

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

 

(1)  Repository 로 설치 하기

  • 설치
# For Ubuntu and Debian
sudo apt-get update
sudo apt-get install docker-compose-plugin

# -------------------------------------------- 

# For RPM-based distros (CentOS, RHEL)
sudo yum update
sudo yum install docker-compose-plugin
  • 업데이트
# For Ubuntu and Debian
sudo apt-get update
sudo apt-get install docker-compose-plugin

# --------------------------------------------------

# For RPM-based distros(CentOS, RHEL)
sudo yum update
sudo yum install docker-compose-plugin


(2) 수동 설치

# Download 
# 만약에... v2.29.1이 아니거나, 사용하는 컴퓨터가 x86_64 가 아니라면 해당 부분을 수정하세요.
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose

# 실행 권한 부여
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

 
 

(3) 테스트

# 테스트
docker compose version
docker compose 설치 테스트

 
 

2. CLI를 다운받아 설치(Compose standalone 설치)

# Download
curl -SL https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

# 실행권한 부여
sudo chmod +x /usr/local/bin/docker-compose

# 테스트
docker-compose

 
만약 docker-compose 명령이 실행되지 않는다면, 해당 경로가 path에 등록되지 않은 경우일 가능성이 높습니다.
아래의 명령으로 symbolic link를 /usr/bin 경로에 생성합니다.

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

 
 


D. 결론 및 추가 정보

docker compose는 매우 훌륭한 도구 입니다.
이제부터는 필요한 서비스를 docker compose로 기동하기 위해서 인터넷에서 docker compse yaml의 샘플을 찾아 보실겁니다. 이때 도움 될만한 얘기들을 좀 하고 마무리 지으려 합니다.
 
 
현재는 compose v2를 사용하고 있습니다.
문서의 version을 굳이 명시할 필요가 없는 버젼입니다.(명시 해도 되구요..경고만 출력하고 정상 동작 될겁니다.)
 

docker compose의 version history
https://docs.docker.com/compose/intro/history/

 
 
문서의 포멧은 총 3가지이고, 하위 버젼 호환은 안됩니다.
가령 샘플을 찾아 보시다 보면 (대부분) version이 명시되어 있는 경우가 있는데, compose file format version에 맞는 샘플을 조합해서 사용하셔야 에러가 안납니다.
단, 한가지 버젼으로 잘 작성해둔 yaml이 있으시다면 compose v2로 실행하실때 version을 명시 하지 않으셔도 알아서 인식 해서 동작 됩니다.
 
이에 따라 문서를 작성하는 방법은 필요할때 마다 샘플 및 문서를 참고하셔서 작성해 보는 연습이 필요 합니다.
 
구조는 앞에서 설명해 드린 형식에서 크게 벗어나지 않을 겁니다.
대부분 services만 정의하면 되는 경우도 많죠.. 
기껏해야 volume 정도 추가 하거나...?
 
처음엔 약간의 노력은 필요합니다만, 한번 만들어 놓은 yaml이 있으면 내내 평화가 찾아올겁니다.