Docker를 사용할 때 Dockerfile을 정의하고 docker build, docker run 등의 명령어로 컨테이너를 관리합니다. 그러나 마이크로서비스 아키텍처에서는 여러 서비스가 각각 여러 인스턴스로 배포되므로 수동으로 시작/중지하는 것은 비효율적입니다.
Docker Compose는 멀티 컨테이너 애플리케이션을 쉽게 관리하는 도구로, 서비스 정의와 실행을 위한 YAML 파일을 통해 자동화할 수 있습니다.
YAML 예시
version: "3.9"
services:
db:
image: postgres:9.4
volumes:
- data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints:
- node.role==manager
app:
image: myapp:latest
ports:
- "8080:80"
depends_on:
- db
networks:
- backend
networks:
backend:
depends_on은 서비스 간 의존성을 정의합니다. 예를 들어 app 서비스가 db 서비스에 의존할 경우 해당 설정을 추가합니다.
설치 방법
GitHub에서 직접 다운로드하는 대신, DaoCloud의 빠른 설치 스크립트를 사용하는 것이 권장됩니다.
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
설치 후 버전을 확인합니다.
docker-compose version
프로젝트 구조 생성
기본 디렉토리와 파일을 생성합니다.
mkdir docker-compose
cd docker-compose
vim app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='db', port=5432)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('visits')
except redis.exceptions.ConnectionError:
if retries == 0:
raise
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return f'Hello World! {count} times visited.'
requirements.txt 파일에 의존성을 정의합니다.
flask
redis
Dockerfile 작성
FROM python:3.7-alpine
WORKDIR /app
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 8080
COPY . .
CMD ["flask", "run"]
docker-compose.yml 구성
version: "3.3"
services:
db:
image: postgres:alpine
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- data:/var/lib/postgresql/data
networks:
- backend
app:
build: .
ports:
- "8080:8080"
depends_on:
- db
networks:
- backend
networks:
backend:
volumes:
data:
실행 및 확인
프로젝트 디렉토리에서 다음 명령어로 서비스를 시작합니다.
docker-compose up
첫 실행 시 필요한 이미지를 다운로드하여 구성합니다. 이후 컨테이너 상태를 확인합니다.
docker ps
웹 브라우저 또는 curl로 서비스에 접근합니다.
curl http://localhost:8080
정리 작업
서비스를 중지하고 자원을 제거합니다.
docker-compose down
이 명령어는 컨테이너와 네트워크를 삭제합니다.