Infra

Docker-compose 다루기

khjoon 2024. 12. 4. 21:02

Docker-compose

  • 여러 컨테이너를 일괄적으로 정의하고 실행할 수 있는 툴
    • 하나의 서비스를 운영하기 위해서는 여러 개의 application이 동작해야 한다.
    • 컨테이너화 된 application 들을 통합 관리할 수 있다.
  • docker-compose의 문법에 맞춰서 yaml 파일을 만들어서 컨테이너를 실행시킨다.

yaml 파일 작성 문법

  • version : compose 버전(버전마다 지원 문법 다름)
  • services : compose 이용해서 실행할 컨테이너 옵션 정의

e.g.

      service:
          webserver:(컨테이너)
                  (세부 정보들)
                  bulild : .
                  image:nginx
                  volumes:
                      - db_data:/var/lib/mysql
                  command : sh -c "yarn-install && yarn un dev"
                  port: 
                      - "80:80"
                  depends_on:
                      - db
            db:(컨테이너)
                    image:redis
                    link:
                        db:mysql
                    enviorment:
                        MYSQL_ROOT_PASSWORD : mysql
  • build : 컨테이너 빌드할 때
  • imgae : compose를 통해 실행할 이미지를 지정
  • command : 컨테이너 실행할 때 실행될 명령어 지정
  • volume : volume mount
  • port : 컨테이너가 열고 있는 port 지정
  • link : 다른 컨테이너와 연계할 때 연계할 컨테이너 지정
  • expose : 포트를 링크로 연결된 컨테이너에게만 공개
  • enviroment : 컨테이너에 적용할 환경변수 정의
  • restart : 컨테이너가 종료될 때 적용할 restart 정책
  • depends_on : 컨테이너 간의 종속성을 정의. 정의한 컨테이너가 먼저 동작되어야 한다.

docker-compose 동작 순서

  1. 서비스 디렉토리 생성
  • mkdir webserber -> cd webserver
  1. 빌드를 위한 dockerfile 생성
  2. docker-compose.yml 생성
  3. docker-compose 명령어
    • docker-compose config : compose 파일 문법 체크
    • docker-compose up -d : docker-compose.yml을 기준으로 백그라운드 모드로 컨테이너 생성/실행
    • docker-compose 있는 디렉토리에서 동작중인 container 상태
    • docker-compose scale mysql=2 : scale in, scale out 가능
    • docker-compose down : 컨테이너 종료

docker-compose 설치

  • docker docs에서 install docker-compose 검색후 linux에 docker-compose 설치 가이드대로 진행

docker-compose 사용해보기

실행 파일 작성

 

$ mkdir composetest
$ cd composetest
$ vi 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)

 

requirements.txt 파일 작성 : 컨테이너에서 실행 파일이 동작할 때 필요한 라이브러리 설치하기 위해서

$ vi requirements.txt
redis
flask

 

Dockerfile 작성

$ vi Dockerfile

 

 

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

 

compose 파일 작성

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

build 하고 실행

가상 머신으로 docker container를 띄운 상태여서 포트포워딩 후 접속

docker-compose 파일 수정해서 local에서 변경하면 바로 container에 적용되도록 volume mount

vi docker-compose.yml
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_DEBUG: "true"
  redis:
    image: "redis:alpine"