본문 바로가기

Container/Docker

[Docker] 도커 컴포즈(Docker Compose)

728x90
반응형

도커 컴포즈(Docker Compose)

공통성을 갖는 컨테이너 애플리케이션 스택을 야믈(YAML) 코드로 정의하는 정의서

  • YAML(YAML Ain't Markup Language) : XML, C, 파이썬, 펄, RFC2822에서 정의된 e-mail 양식에서 개념을 얻어 만들어진 '사람이 쉽게 읽을 수 있는' 데이터 직렬화 양식

도커 컴포즈 다중 컨테이너 애플리케이션 예시

이렇게 공통 목적을 갖는 애플리케이션 스택을 도커 컴포즈 야믈 코드로 정의해서 한 번에 서비스를 올리고 관리할 수 있는 도구를 도커 컴포즈라고 한다.

 

도커 컴포즈로 실행된 컨테이너는 독립된 기능을 가지며 공통 네트워크로 구성되기 때문에 컨테이너 간 통신이 쉽고 공통성 있는 컨테이너들을 포함하여 쉽고 빠른 런타임 환경을 제공한다.

 

도커 컴포즈는 테스트, 개발, 운영의 모든 환경에서 구성이 가능한 오케스트레이션 도구 중 하나지만 다양한 관리 기능을 가지고 있지 않기 때문에 테스트와 개발환경에 적합하다. 

 

실제 운영환경에서는 도커 스웜이나 쿠버네티스와 같은 오케스트레이션 도구와 함께 사용하는 것을 권장한다.

 

 

설치

설치 방법은 OS별로 다르기 때문에 Doc를 참고해서 각자 운영체제에 맞는 방법으로 설치한다.

 

Overview of installing Docker Compose

 

docs.docker.com

 

 

Docker-Compose YAML 파일 작성

도커 컴포즈의 YAML 파일은 다음과 같은 구조를 가진다.

version: "3.9" # 도커 컴포즈 버전
services: # 서비스 정의
  service1: # 서비스 이름
    image: image1 # 사용할 이미지 이름
    ports: # 포트 매핑
      - "5000:5000"
    volumes: # 볼륨 마운트
      - .:/code
    environment: # 환경 변수 설정
      - DEBUG=1
  service2:
    image: image2
    depends_on: # 의존성 설정
      - service1
 ....
networks:
 	# 네트워크 설정, 미설정 시 자동 생성
volumes:
	# 볼륨 설정

 

Services의 주요 옵션들

  • image: 사용할 도커 이미지의 이름을 지정합니다. 이미지가 로컬에 없으면 도커 허브에서 자동으로 다운로드합니다.
  • build: 도커 이미지를 빌드하기 위한 경로나 설정을 지정합니다. Dockerfile이 있는 디렉토리나 URL을 입력하거나 context, dockerfile 등의 옵션을 사용할 수 있습니다.
  • command: 컨테이너가 시작될 때 실행할 명령어를 지정합니다. Dockerfile의 CMD와 비슷하지만 오버라이드됩니다.
  • ports: 호스트와 컨테이너 간에 포트를 매핑합니다. 호스트 포트와 컨테이너 포트를 콜론(:)으로 구분하여 입력하거나 프로토콜(tcp/udp)도 함께 입력할 수 있습니다.
  • expose: 컨테이너가 내부적으로 열어두는 포트를 지정합니다. 외부에 노출되지 않으며 같은 네트워크에 있는 다른 서비스들과 연결됩니다.
  • volumes: 호스트와 컨테이너 간에 볼륨을 마운트합니다. 호스트 경로와 컨테이너 경로를 콜론(:)으로 구분하여 입력하거나 읽기 전용(read-only) 옵션도 추가할 수 있습니다.
  • environment: 컨테이너 내부에서 사용할 환경 변수를 지정합니다. 키=값 형식으로 입력하거나 .env 파일을 참조할 수 있습니다.
  • env_file: 환경 변수가 정의된 파일의 경로를 지정합니다. .env 형식의 파일을 사용하면 여러 개의 환경 변수를 한 번에 설정할 수 있습니다.
  • depends_on: 서비스 간에 의존성을 지정합니다. depends_on 옵션에 의존하는 서비스는 depends_on 옵션에 명시된 서비스들보다 나중에 시작됩니다.
  • networks: 컨테이너가 속할 네트워크를 지정합니다. 도커 컴포즈는 기본적으로 모든 서비스를 하나의 네트워크에 연결하지만, networks 옵션을 사용하면 여러 개의 네트워크를 생성하고 컨테이너를 할당할 수 있습니다.
  • links: 컨테이너 간에 링크를 생성합니다. 링크된 컨테이너는 서로 호스트 이름으로 접근할 수 있습니다. 네트워크 옵션과 함께 사용할 수 있습니다.
  • restart: 컨테이너가 종료될 때 재시작 정책을 지정합니다. no, always, on-failure, unless-stopped 중에서 선택할 수 있습니다.
  • healthcheck: 컨테이너의 건강 상태를 검사하는 방법을 지정합니다. test, interval, timeout, retries 등의 옵션을 사용할 수 있습니다.

 

services 이외에도 여러가지를 정의할 수 있다.

  • volumes: 여러 개의 서비스에서 공유하는 볼륨을 정의합니다. 이름과 드라이버 등의 옵션을 지정할 수 있습니다.
  • networks: 여러 개의 서비스에서 공유하는 네트워크를 정의합니다. 이름과 드라이버 등의 옵션을 지정할 수 있습니다.
  • configs: 여러 개의 서비스에서 공유하는 설정 파일을 정의합니다. 이름과 파일 경로 등의 옵션을 지정할 수 있습니다.
  • secrets: 여러 개의 서비스에서 공유하는 비밀 정보를 정의합니다. 이름과 파일 경로 등의 옵션을 지정할 수 있습니다.

 

 

Docker-Compose 예시

flask와 redis를 컨테이너를 Docker-Compose로 실행해본다.

 

먼저 web을 담당하는 flask 서버를 만들고 도커 이미지를 만든다.

# main.py
from flask import Flask, render_template
from redis import Redis

main = Flask(__name__)
redis = Redis(host='redis', port=6379)


@main.route('/')
def index():
    count = redis.incr("hits")
    title = f'Flask Server&Redis With Docker\nCount = {count}'
    return render_template('index.html', title=title)


if __name__ == '__main__':
    main.run(host='0.0.0.0', port=5050)
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Flask</title>
    </head>
    <body>
        <h1>{{ title }}</h1>
    </body>
</html>

 

다음 명령어로 의존성을 정의한 파일을 생성한다.

pip freeze > requirements.txt

 

다음은 도커 파일을 작성한다.

# 공식 Python 런타임 이미지를 베이스 이미지로 사용
FROM python:3.9-alpine

# 컨테이너 내에서 작업 디렉토리를 설정합니다
WORKDIR /usr/src/app

# Flask 앱 코드를 컨테이너로 복사합니다
COPY src ./src

# requirements.txt를 컨테이너로 복사하고 필요한 패키지를 설치합니다
COPY requirements.txt ./
RUN pip install -r requirements.txt

# 앱이 실행되는 포트를 노출합니다
EXPOSE 5050

# 애플리케이션을 실행하는 커맨드를 설정합니다
CMD ["python", "src/main.py"]

 

도커 이미지를 빌드한다.

docker build -t flask-app .

 

redis 이미지를 다운받는다.

docker pull redis

 

docoker-compose YAML 파일을 작성한다.

version: "3.8"
services:
  web:
    image: "flask-app"
    build: .
    ports:
      - "5050:5050"
  
  redis:
    image: "redis"

 

YAML 파일이 있는 위치에서 다음 명령어로 도커 컨테이너들을 실행한다.

docker-compose up

 

컨테이너들을 종료하려면 다음과 같은 명령어를 입력하면 된다.

docker-compose down

 

 

Docker-Compose 명령어

모든 서비스 실행하기

docker-compose up

 

백그라운드에서 모든 서비스 실행하기

docker-compose up -d

 

특정 서비스만 실행하기

docker-compose up service1 service2

 

모든 서비스 중지하고 제거하기

docker-compose down

 

모든 서비스 중지하기

docker-compose stop

 

모든 서비스 일시 정지

docker-compose pause

 

일시 중지된 서비스 다시 시작

docker-compose unpause

 

모든 서비스 시작하기

docker-compose start

 

모든 서비스 재시작하기

docker-compose restart

 

현재 실행중인 서비스 상태 확인하기

docker-compose ps

 

로그 확인하기

docker-compose logs

 

YAML 파일의 설정 확인

docker-compose config

 

해당 컨테이너의 공개된 포트 정보를 확인

docker-compose port [options][--] 서비스 공개 포트

Ex
docker-compose port flask 9000
> 0.0.0.0:9000

 

728x90
반응형