Docker Compose 기초 가이드

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

이 명령어는 컨테이너와 네트워크를 삭제합니다.

태그: YAML Containerization Dockerfile microservices Docker Compose

6월 29일 23:05에 게시됨