* Docker compose 란?

여러 컨테이너를 모아서 관리할 수 있는 툴이다. 여러 컨테이너를 실행시킬 때 각 컨테이너마다 구성이나 시작/정지 등을 관리하면 운용이 매우 복잡하다. 따라서 서비스 단위로 컨테이너를 묶어 일괄적으로 관리할 필요가 있다.

 

docker compose는 docker-compose.yml 이라는 파일에 컨테이너 구성 정보(이미지, 환경변수, 네트워크, 포트 기타등등)를 정의함으로써 동일 호스트상의 여러 컨테이너를 일괄적으로 관리할 수 있다. 즉, 서로 아무런 관계가 없는 컨테이너들을 docker compose로 묶는 것이 아니고, 서로 연관관계가 있는 경우에 사용하는 것이다.

 

docker compose를 사용하면 서비스단위로 docker compose.yml 파일을 만들어놓고 필요할 때 사용할 수 있다. 실제 운영에서 대부분 이런식으로 사용된다. 또한 docker compose로 시작한 컨테이너들도 보통의 도커 명령을 사용할 수 있으며, docker compose 컨테이너를 생성하면 docker0 를 사용하지 않고 알아서 별도의 네트워크 브릿지를 따로 생성해서 사용한다.

 

더 상세한 정보는 https://docs.docker.com/compose/ , https://doc.docker.com/compose/reference/ 참고할 것

 

# 참고 : dockerfile과 docker-compose 비교

- dockerfile :  여러개의 이미지를 만들 수 있고, run은 하지 않는다.

- docker-compose :  여러개의 이미지를 만들 수 있고, run까지 수행한다.

 

 

* 사전이해 : 인프라 구성 예시 - 웹 3계층 시스템 아키텍쳐

도커에서 여러개의 컨테이너를 어떻게 연계하여 운영하는지 이해하려면 인프라 구성을 이해해야 한다. 그 중 가장 많이 사용되는 웹 3계층 시스템 아키텍쳐를 예시로 알아보자.

 

어플리케이션을 가동시키려면 여러개의 서버에 기능과 역할을 분할하여 인프라의 전체 구성을 정한다. 이것을 인프라 아키텍처라고 한다. 대규모 웹 시스템의 경우 몇 개의 서브시스템/기능 으로 나누어 시스템을 개발하는 경우가 많다. 웹3계층 아키텍쳐는 웹 어플리케이션의 대표적인 인프라 아키텍쳐 중 하나로, 웹 시스템 서버들을 역할별로 3개로 나눈다. 대부분이 이렇게 사용한다.

 

프론트서버 ↔ 어플리케이션서버  데이터베이스서버

 

이러한 구조는 논리적인 분할이므로 부하가 적은 시스템에서는 한 노드에서도 구현이 가능하다.  클라우드 시스템에서 실행할 때는 부하에 따른 오토스케일 기능을 사용하는 것이 좋다.

 

1. 프론트 서버

클라이언트의 웹 브라우저가 보낸 http 요청을 받아, http 응답을 반환하는 서버 기능을 가진다. 웹 프론트 서버 또는 웹 서버라고 부른다. 웹 서버의 기능은 미들웨어로 구축하는 경우도 있고, 오픈소스인 nginx, 마이크로소프트 IIS 등도 있다. 요청의 처리가 메인 업무이므로 부하가 높은 경우에는 scalable하게 처리 대수를 늘리고, 로드밸런서와 같은 기기를 사용하여 부하를 분산한다.

 

2. 어플리케이션 서버

어플리케이션 서버는 업무 처리를 실행하는 서버이다. 결제 처리, 수주 처리 등 에플리케이션의 처리를 실행하는 프로그램의 실행 환경이 된다. 애플리케이션 서버 기능도 프론트 서버 기능과 마찬가지로 미들웨어로 구축하는 경우도 있다.

 

3. 데이터베이스 서버

데이터베이스서버는 영구 데이터를 관리하기 위한 서버이다. 애플리케이션의 처리 실행에서 발생하는 영구 데이터는 RDBMS기능을 갖고 있는 미들웨어에서 관리된다. 주요 미들웨어로는 MYSQL, postgreSQL, 오라클 등이 있다. 영구 데이터는 높은 가용성이 요구되므로 클러스터 같은 기술로 다중화한다. 또한 만일의 장애를 대비하여 데이터의 백업이나 원격지 보관 등과 같은 대책이 필요하다. 추가적으로, 데이터베이스를 조작하는 처리는 부하가 걸릴 수 있으므로 시스템 전체의 병목 부분이 되는 경우가 있다. 그래서 운용 상황에 따라 OS나 미들웨어의 파라미터 설정의 변경과 같은 퍼포먼스 튜닝이 필요하다.

 

# 참고 : NOSQL

NOSQL은 RDBMS와는 다른 새로운 방식을 총칭한다. 병렬분산처리나 유연한 스키마 설정 등이 특징이며, 주요 방식으로는 KVS(Key-value 스토어)나 도큐먼트 지향 데이터베이스 (도큐먼트 데이터베이스) 등이 있다. 대량의 데이터 축적이나 병렬처리가 특기이므로 많은 사용자의 액세스를 처리할 필요가 있는 온라인 시스템 등에서 널리 사용된다. 오픈소스인 redis 나 mongoDB가 유명하다.

 

 

* docker-compose.yml 정의 파일 개념

docker-compose.yml 정의 파일은 웹 애플리케이션의 의존관계 (데이터베이스 ,큐, 캐시, 애플리케이션 등)를 모아서 설정할 수 있다. 이 정의 파일을 구축해두면 이 파일을 바탕으로 docker-compose 명령을 실행하여 여러개의 컨테이너를 모아서 시작하거나 정지할 수 있다.

 

또한 컨테이너 구성정보들을 yaml 파일로 관리할 수 있어 지속적 deploy나 지속적 integration 프로세스에 있어 자동 테스트를 할 떄의 환경 구축에도 그대로 이용할 수 있다. 하나의 docker-compose.yml 정의파일에는 여러개의 도커 컨테이너를 설정하며, 서로 의존관계를 가질 수 있다. 예를들어 웹서버와 db 각각의 컨테이너를 정의했다면 db가 올라와야 웹서버가 뜰 수 있다. 이런식의 의존성이 있다는 것이다. 또한 확장자는 .yml, yaml 모두 사용 가능하다.

 

 

* docker-compose 설치

1. docker compose 버전 확인

https://github.com/docker/compose/releases

 

2. docker compose 다운로드

github를 통해 수동으로 다운받을 수 있다. 각 운영체제 벤더 종류별로 (yum, apt-get 등)으로 받을수 있는데 뭔가 동작이 제한적이다. 안되는 게 여러가지 있어서 수동 설치를 권고한다. 아래 명령어대로 다운받으면 되며, 1번에서 확인된 버전 숫자를 기입하면 된다. (아래 1.26.0 부분, 2020.6.25 기준 1.26.0이 가장 최신임)

curl -L https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

 

3. 버전확인

docker-compose -v

혹시 permission denied가 뜨는 경우, 해당 경로로 들어가서 실행권한을 주면 된다.

cd /usr/local/bin/
chmod 744 docker-compose

+ Recent posts