MLOps

Docker Compose | 여러 컨테이너 관리하기

cstory-bo 2023. 12. 24. 12:07

 

Docker Compose

이번 포스팅은 도커 컴포즈에 관한 내용이다.
멘토님이 실제 서비스에서는 여러 컨테이너를 띄우기 때문에
docker compose 공부를 추천해주셨다!👍

docker compose란

Docker compose는
compose 파일로 여러 컨테이너를 관리하기 쉽게 해주는 기능이다.

아래 실습 내용들은 도커의 공식 document를 따라 실습 후, 작성하였다.

installation

우선 나는 Docker desktop을 설치하였다.

이 경우 docker-compose는 설치되어있으며,
터미널에

docker-compose

입력 시 아래 결과로 설치되어있음을 확인할 수 있다.

app.py

다음은 redis와 flask를 이용한 간단한 웹페이지 작성이다.

get_hit_count 함수로 페이지가 갱신될 때 마다
값을 1 증가시키며 반환한다.

가장 기본 path인 ~/ 로 접근할 경우 hello 함수가 작동하며
get_hit_count에서 받아온 값을
Hello Wordl!~~ ~times. 사이에 넣어서 보여준다.

requirements.txt

그 다음 redis와 flask는 docker 안에서 따로 설치가 필요하기 때문에 작성해준다.

flask
redis

Dockerfile

이번에는 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"]
  • Python 3.7 image에서 시작한다.
  • working directory 를 /code로 설정한다.
  • flask를 위한 환경설정을 한다.
  • gcc등 다른 dependencies를 설치한다.
  • requirements.txt를 복사하고 이를 설치한다.
  • EXPOSE로 5000번 포트를 외부에 공개할 예정이라고 알려준다.
  • 현재 디렉토리를 workdir .으로 복사한다.
  • 마지막으로 flask run 로 웹을 실행한다.

docker-compose.yml

docker compose를 위한 파일을 작성한다.

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

Build and run my app

터미널에서

docker-compose up

을 실행한다.

그리고 localhost:8000을 확인한다.

새로고침하면 숫자가 계속해서 늘어나는 것을 확인할 수 있다.

내릴 때는

docker-compose down

를 입력한다.

그리고 image를 확인하면
여러 이미지가 생성된 것을 볼 수 있다.

docker images

Edit the compose file

이번에는 bind mount를 추가하려고 한다.

docker-compose.yml에 volumes와 environment를 추가한다.

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"
  • volumes로 현재 프로젝트 디렉토리를 host의 /code안 컨테이너에 마운트한다.
    그러면 코드를 수정해도 이미지를 rebuild 할 필요가 없다.

Re-build and run the app

위에서 했던 것처럼 다시

docker-compose up

를 입력한다.

잘 업데이트 되는지 확인하기 위해서
app.py의 hello function의 return 부분을 아래와 같이 바꿔준다.

return 'Hello from Docker! I have been seen {} times.\n'.format(count)


rebuild 없이 잘 변경된 것을 확인할 수 있다.

background 실행

background에서 돌리고 싶으면 -d flag를 추가한다.

docker-compose up -d

stop 할 때는

docker-compose stop

down과 함께 volumes 데이터를 삭제하고 싶을 때는

docker-compose down --volumes

를 입력한다.