일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- centos7
- mysql
- K8s
- Spring JPA
- Kotlin
- AWS
- producer
- git
- CI
- Streams
- Entity
- Kubernetes
- entity graph
- spring kafka
- kafka
- offsetdatetime
- CodePipeline
- transactionaleventlistener
- spring
- mirror maker2
- ECS
- Spring Data JPA
- cd
- PAGING
- QueryDSL
- topic생성
- JPA
- bean
- consumer
- API
- Today
- Total
Yebali
docker-compose 본문
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 |