보통 간단한 서비스를 POC할때, docker container를 하나 만들어, 개발을 진행하곤 한다.
하지만, 여러개의 애플리케이션과 데이터베이스를 구성해서 사용해야할때, 각 애플리케이션과 데이터베이스는
서로 다른 환경과 종속성을 가지고 만들어져야할때가 있다.
이때, 만약 각 애플리케이션이 실행된 container를 별도로 관리하고 모니터링 해야한다면 매우 불편할 수 있을것이다.
이와 같이 복수의 docker container를 운영할때, 이를 동시에 실행, 관리 하기 위한 도구인 docker compose를 알아보려한다.
Docker Compose란?
- Docker 기반의 multi container 애플리케이션을 "정의", "실행", "관리"하기 위한 도구이다.
Docker Compose의 장점?
- 웹 애플리케이션의 경우 웹 서버 컨테이너와 데이터 베이스 컨테이너 등 여러개의 컨테이너로 구성되는 경우가 많은데, Docker Compose를 사용하면 각 컨테이너의 구성 정보를 한 곳에서 관리할 수 있으며 컨테이너간의 의존성을 자동으로 처리하여 애플리케이션을 쉽게관리할 수 있다.
- 여러개의 Docker 컨테이너를 한번에 실행하고, 각 컨테이너의 네트워크 연결 및 데이터 볼륨 공유를 자동으로 처리할 수 있음
- 여러 컨테이너를 동시에 실행하거나 컨테이너간의 의존성 관리를 자동으로 처리할 수 있음
웹 서버 컨테이너와 데이터베이스 컨테이너를 따로 구성하는 이유는?
웹 서버와 데이터베이스의 경우 각각 요구 사항이 다르고, 별개의 종속성을 가지고 분리되어 운영되어야 하기 때문이다. 웹서버와 데이터 베이스 컨테이너의 주요 요구사항 예시는 아래와 같다.
컨테이너 구분컨테이너 생성 시 주요 요구사항
컨테이너 구분 | 컨테이너 생성 시 주요 요구사항 | |
웹서버 컨테이너 | 특정 포트 사용 | HTTP요청을 수신하기 위해 특정 포트를 사용해야하며, 이 포트는 컨테이너와 호스트간의 포트 매핑을 통해 호스트에서도 접근이 가능해야한다. |
파일 또는 코드 공유 |
웹서버 컨테이너에서 실행되는 애플리케이션은 웹페이지, 이미지, 자바스크립트 파일 등의 정적 파일(정적파일은 소스코드나 그 외 파일을 의미)을 제공할 수 있음. 이러한 정적 파일은 컨테이너 내부에 저장되어 있어야 하지만, 개발자는 이 파일들을 로컬 컴퓨터에서 편집하고 디버깅할 수 있어야함. 따라서, 호스트와 컨테이너간의 디렉토리를 공유(호스트의 디렉토리를 컨테이너로 마운트하는 행위를 의미)하는 것이 필요함 - 아래 docker run 명령어를 통해 호스트 디렉토리를 컨테이너로 마운트할 수 있지만, yaml파일을 통해 docker compose up하는 경우 굳이 docker run할 필요없음(volumns로 정의해놓으면 되기 때문)
* docker run -v /path/to/host/directory:/path/to/container/directory image_name |
|
데이터베이스 컨테이너 | 데이터베이스 소프트웨어 설치 | 데이터베이스 컨테이너에는 데이터 베이스 소프트웨어가 설치되어 있어야함(ex.MySQL, PostgreSQL, MongoDB 등) |
데이터베이스 초기화 및 구성 | - 데이터베이스 컨테이너 시작할 때, 데이터베이스를 초기화하고 구성해야함. - 이 과정에서 데이터베이스의 스키마와 테이블을 생성하고 초기 데이터를 적재함. | |
백업과 복구 | - 데이터베이스 컨테이너에서는 데이터베이스의 백업과 복구 기능이 필요 - 이를 위해 데이터베이스 소프트웨어에서 제공하는 백업 및 복구 도구를 사용 | |
데이터베이스 보안 | 데이터베이스 컨테이너는 중요한 데이터를 저장하므로, 보안이 중요. 따라서 암호화, 인증, 권한관리등을 통해 데이터베이스를 보호해야함. 해당 내용에 대한 정의 필요 | |
성능 | 데이터베이스 실행 시 CPU, 메모리, 디스크 I/O등의 하드웨어 리소스등을 고려하여 정의 필요 | |
확장성 | 데이터베이스 컨테이너는 데이터양이 증가하면 확장할 수 있어야 함. 샤딩(sharding), 레플리케이션(replication)과 같은 기술을 사용하여, 데이터베이스 확장이 가능하도록 정의 |
YAML?
- 주로 파일 구성이나 데이터 전송을 위해 사용하는 파일의 한 형태로, docker에서는 해당 yaml파일 형식을 사용해서 애플리케이션의 구성요소를 정의한다.
- 일반적으로 텍스트 파일로 저장되며, 확장자는 .yaml 또는 .yml로 사용됩니다.
- yml파일은 들여쓰기를 통해 계층적인 데이터를 나타내며, 각 데이터 요소는 콜론(:)을 사용하여 이름과 값으로 구분됩니다.
- 들여쓰기는 탭 또는 공백(스페이스) 2~4개 사용이 권장됨
- Docker Compose YAML 파일 예제
- 아래 YAML 파일은 다음과 같은 동작을 수행함
version: '3' #Compose 파일 버전을 지정합니다. 이 예제에서는 버전3을 사용합니다.
services: # 애플리케이션의 각 서비스를 정의합니다.
web: # 웹 서버를 정의합니다.
build: . #Dockerfile에서 이미지를 빌드합니다.
ports: # 호스트와 컨테이너간의 포트 매핑을 정의합니다.
- "5000:5000"
volumes: # 호스트와 컨테이너 간의 디렉토리 매핑을 정의합니다.
- .:/code
links: #Redis 서비스와 연결됩니다.
- redis
redis: #Redis 데이터 베이스를 정의합니다.
image: "redis:alpine" #Docker Hub에서 이미지를 가져옵니다.
- 'docker-compose up' 명령을 실행하여 웹 서버 및 Redis 데이터베이스를 시작합니다.
- 'web' 서비스는 현재 디렉토리에서 Dockerfile을 사용하여 이미지를 빌드하고 호스트의 5000번 포트를 컨테이너의 5000번 포트로 매핑합니다.
- 현재 디렉토리를 컨테이너의 code 디렉토리에 마운트합니다.
- 'redis' 서비스는 Redis:alpine 이미지를 사용하여 컨테이너를 시작합니다.
- 'web'서비스는 'redis'서비스와 연결됩니다.
- 위 예제는 Docker Compose YAML 파일을 사용하여 두개의 서비스('web', 'redis')를 정의하는 방법을 보여줍니다.
- YAML파일을 사용하여 복잡한 애플리케이션을 구성하고 실행할 수 있습니다.