본문 바로가기
INFRA/DevOps

[Docker] Docker-compose를 사용하여 빌드부터 운영

by BTC_비웃는사나이 2022. 7. 25.

Docker-compose란?

  • 여러 container를 일괄적으로 정의하고 실행할 수 있는 tool
  • container화 된 application들을 통합 관리 할 수 있음Overview of Docker Compose 참고
  • yaml file 문법 (Compose file version 2 reference , Compose file version 3 reference 참고)
    • version : compose version
      version에 따라 지원 문법이 다름.
    • service : compose를 이용해서 실행할 container option을 정의
    • build : container build
    • image : compose를 통해 실행할 image를 저장
    • command : container에서 실행될 명령어 지정
    • port : container가 공개하는 port를 나열
    • link : 다른 container와 연계할 때 연계할 container 지정
    • expose : port를 link로 연계된 container에게만 공개할 port
    • volumes : container에 volume을 mount
    • environment : container에 적용할 환경변수를 정의
    • restart : container가 종료될 때 적용할 restart 정책
      • no : 재시작 되지 않음
      • always : container를 수동으로 끄기 전까지 항상 재시작
      • on-failure : 오류가 있을 시에 재시작
    • depends_on : container 간의 종속성을 정의
      정의한 container가 먼저 동작 되어야 함

 

Docker-compose command

  • up : container 생성/시작
    • --scale : container 개수 증가/감소
  • ps : container 목록 표시
  • logs : container log 출력
  • run : container 실행
  • start : container 시작
  • stop : container 정지
  • restart : container 재시작
  • pause : container 일시정지
  • unpause : container 재개
  • port : 공개 port 번호 표시
  • config : 구성 확인
  • kill : 실행 중인 container 강제 정지
  • rm : container 삭제
  • down : resourece 삭제
    • --volumes : volume까지 삭제

반드시 docker-compose.yml file이 있는 directory에서 명령 실행 가능

 

[ Hands - on ]

Docker-compose 설치 (

Install Docker Compose 참고)

  • prerequisites
  • 설치 확인
docker compose verison

 

Container 빌드에서 운영까지 (Get started with Docker Compose 참고)

  • service directory 생성
mkdir composetest
cd composetest
 
  • build를 위한 dockerfile 생성
cat >> app.py << EOF
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)
EOF
cat >> requirements.txt << EOF
flask
redis
EOF
cat >> dockerfile << EOF
# 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"]
EOF
  • docker-compose.yml 생성
cat >> docker-compose.yml << EOF
version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"
EOF
  • docker-compose command로 application build and run
docker compose up
  • 실행 확인

  • docker-compose.yml file 수정
cat > docker-compose.yml << EOF
version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"
EOF
  • docker-compose command로 application rebuild and rerun
docker compose up -d
  • 실행확인

  • host의 app.py code 내용 변경
vi app.py

  • 변경된 사항 적용 확인

  • conatiner 개수 증가
docker compose up -d --scale redis=3
  • 추가 command 확인
docker compose run web env
docker compose logs web
  • container 삭제
docker compose down --volumes

 

Mysql을 사용하는 Wordpress 운영 (Quickstart: Compose and WordPress 참고)

  • service directory 생성
mkdir my_wordpress
cd my_wordpress/
  • docker-compose.yml file 생성
cat >> docker-compose.yml << EOF
version: "3.9"
    
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}
EOF
  • container build and run
docker compose up -d
  • http://localhost:8000 로 접속하여 생성 확인

  • db contents 확인 (root user로 확인 가능)
ls -al /var/lib/docker/volumes/my_wordpress_db_data/_data

  • container 삭제
docker compose down --volumes

댓글