Docker 기초 (16) - docker-compose

이것저것 개발자·2022년 3월 29일
0

Docker 기초

목록 보기
16/17

docker-compose

단일 서버에서 여러 컨테이너를 프로젝트 단위로 묶어서 관리
docker-compose.yml YAML파일을 통해 명시적 관리

프로젝트 단위로 도커 네트워크와 볼륨 관리
프로젝트 내 서비스 간 의존성 정의 가능
프로젝트 내 서비스 디스커버리 자동화
손 쉬운 컨테이너 수평 확장

프로젝트 / 서비스 / 컨테이너

프로젝트

도커 컴포즈에서 다루는 워크스페이스의 단위
함께 관리하는 서비스 컨테이너의 묶음
프로젝트 단위로 기본 도커 네트워크가 생성 됨

서비스

도커 컴포즈에서 컨테이너를 관리하기 위한 단위
scale을 통해 서비스 컨테이너의 수 확장 가능

컨테이너

서비스를 통해 컨테이너 관리

docker-compose.yml

version: "3.9"

service:
	web:
    	...
    database:
    	...
network:
	...

volumes:
	...

version, service, networks, volumes

총 4개의 최상위 옵션이 존재

버전 (version)

2021년 11월 기준 3.9가 최신 버전
가능한 최신 버전 사용 권장
도커 엔진 및 도커 컴포즈 버전에 따른 호환성 메트릭스 참조

https://docs.docker.com/compose/compose-file/compose-file-v3/

버전 3부터 Docker Swarm과 호환

  • Swarm 서비스를 docker-compose.yml으로 정의 가능

도커 스왐 (Docker Swarm)
여러 서버를 기반으로 스왐 클러스터를 형성하여 컨테이너를 관리하는
오케스트레이션 시스템
쿠버네티스와 동일 목적으로 만들어짐

서비스 (service)

프로젝트내에서 구성되는 여러 서비스들

네트워크 (network), 볼륨 (volume)

프로젝트 내에서 사용될 네트워크목록, 도커 볼륨

네트워크는 정의를 하지 않더라도 default 네트워크가 생성됨

docker-compose 명령어: 확인

// 실행중인 프로젝트 목록 확인
docker-compose ls

// 전체 프로젝트 목록 확인
docker-compose ls -a

docker-compose 실습

Dockerfile

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"]

app.py

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)

docker-compose.yml

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

requirements.txt

flask
redis

4개의 파일을 준비하고

docker-compose up

위 명령어를 사용해보자

빌드중


default 브릿지 네트워크 생성
이름을 지정하지 않을 시 폴더명으로 생성된다.

성공적으로 빌드 후 실행이 되었다면 Ctrl + C로 현재 실행중인 컨테이너를
종료하고

docker-compose -p my-project up -d
  • -p
    - 프로젝트 이름 변경
  • -d
    - 백그라운드로 실행

위 명령어로 다시 실행시켜보자

docker-compose 명령어: 실행 및 종료

// Foreground로 도커 컴포즈 프로젝트 실행
docker-compose up

// Background로 도커 컴포트 프로젝트 실행
docker-compose up -d

// 프로젝트 이름 my-project로 변경 하여 도커 컴포트 프로젝트 실행
docker-compose -p my-project up -d

// 프로젝트 내 컨테이너 및 네트워크 종료 및 제거
docker-compose down

// 프로젝트 내 컨테이너, 네트워크 및 볼륨 종료 및 제거
docker-compose down -v

docker-compose 명령어: 서비스 확장

// web 서비스를 3개로 확장
docker-compose up --scale web=3

docker-compose 명령어: 프로젝트 내

// 서비스 로그 확인
docker-compose logs

// 컨테이너 내 이벤트 확인
docker-compsoe events

// 이미지 목록
docker-compose images

// 컨테이너 목록
docker-compose ps

// 실행중인 프로세스 목록
docker-compose top
profile
조호영, Developing something

0개의 댓글