Yebali

docker-compose 본문

Backend Common

docker-compose

예발이 2023. 7. 9. 16:16

docker-compose란?

여러 도커 컨테이너 애플리케이션들을 정의하고 실행키시키기 위한 툴이다.

YMAL을 사용해서 서비스를 정의하고 실행한다.

예제

아래 예제는 Docker공식 docs에 있는 예제이다.

redis와 flask를 사용해서 방문 횟수를 계산하는 웹 서비스이다.

1. flask app 작성하기

먼저 docker 컨테이너로 만들 웹 서버를 아래와 같이 정의한다.

'/'로 요청이 들어왔을 때 redis의 'hits' key의 value를 1 증가시키며 방문 수를 계산하는 서버이다.

실패할 경우 0.5초 간격으로 총 5회 시도한다.

# app.py

import time
import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

위 앱을 실행시키기 위한 의존성을 설치하기 위해 'requirement.txt' 파일을 만들고 아래 값들을 넣어준다.

flask
redis

2. Dockerfile 작성하기

docker image를 만들기 위한 작업이며 python:3.7-alpine 이미지를 사용한다.

RUN 명령을 통해 'gcc', 'musl-dev', 'linux-headers'와 requirement.txt에 정의된 의존성들을 설치한다.

EXPOSE 명령을 통해 이미지의 5000번 포트를 외부에 열어준다.

CMD 명령을 통해 이미지가 시작될 때 'flask run' 명령을 실행한다.

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
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 5000
COPY . .
CMD ["flask", "run"]

3. docker-compose.yml 작성하기

위에서 정의한 flask app과 redis를 한 환경으로 묶는 과정이다.

'services' 하위에 위치한 'web', 'redis'란 이름의 컨테이너를 띄우며 

'web'의 경우 동일한 디렉터리에 정의한 'Dockerfile'을 빌드하여 이미지를 만들고 호스트의 8000 포트에 매핑한다.

'redis'는 'redis:alpine'이미지를 사용하여 띄운다.

services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

4. docker-compose 실행하기

위 과정을 끝냈다면 'docker compose up' 명령을 통해 실행한다. (docker가 실행중이어야 한다)

오류가 없다면 아래와 같이 빌드되고 flask app이 실행하는 모습을 볼 수 있다.

그리고 docker desktop에서 아래와 같이 'web', 'redis'라는 이름으로 실행중인 컨테이너를 볼 수 있다.

'127.0.0.1:8000'에 접속한다면 새로고침 할 때마다 방문 수가 증가하는 웹 서비스를 볼 수 있다.

kafka server via docker compose 

아래는 kafka를 dockr compose를 사용해띄우는 docker-compose.yml 파일이다.

version: '3'
services:
  zookeeper:
    image: docker.io/bitnami/zookeeper:latest
    platform: linux/arm64
    volumes:
      - "zookeeper_data:/bitnami"
    environment:
      ALLOW_ANONYMOUS_LOGIN: yes
    ports:
      - "2181:2181"
  kafka:
    image: docker.io/bitnami/kafka:latest
    platform: linux/arm64
    depends_on:
      - "zookeeper"
    volumes:
      - "kafka_data:/bitnami"
    environment:
      KAFKA_ENABLE_KRAFT: no
      KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
      KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://127.0.0.1:9092
      ALLOW_PLAINTEXT_LISTENER: yes
    ports:
      - "9092:9092"

volumes:
  zookeeper_data:
    driver: local
  kafka_data:
    driver: local

 

Ref.

'Backend Common' 카테고리의 다른 글

Sync/Async, Blocking/Non-Blocking  (0) 2023.10.09
백엔드 면접 질문  (0) 2023.08.09
분산락과 Redisson  (0) 2023.05.08
[Socket] Socket이란?  (0) 2023.01.17
Time zone과 표준시  (0) 2022.11.27