Docker Compose 기본기

ekgns0508·2024년 1월 18일

Docker

목록 보기
3/5

Docker Compose는 YAML 파일을 사용하여 애플리케이션의 서비스, 네트워크, 볼륨 등의 구성을 정의한다.
DockerCompose를 이용하여 MySQL 컨테이너 하나를 만들어본다.

docker-compose.yml

services:
  mysqldb:
    image: mysql
    restart: always
    volumes:
      - ./data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root1234
      - MYSQL_DATABASE=rootdb
    ports:
      - "3307:3306"

volumes:
  mysql-compose-volume:
  • services : 정의할 서비스들을 포함한다.
  • mysqldb : 서비스의 이름을 정의한다. (다른 이름으로 변경해도 된다.)
  • image : 사용할 이미지를 지정한다.
  • restart: always : 컨테이너가 종료되면 재시작하도록 설정한다.
  • volumes : 호스트 머신의 ./data 경로를 볼륨으로 연결한다.
  • environment : 환경변수들을 선언한다.
  • ports : 호스트 머신의 3307 포트를 컨테이너의 3306 포트로 포워딩한다.
  • volumes : 사용할 볼륨을 정의한다. 여기서는 ‘mysql-compose-volume’ 이름의 볼륨을 정의한다.

docker-compose 실행

$ docker-compose up -d

명령어를 사용하여 docker-compose.yml 파일을 통해 컨테이너를 빌드하고 백그라운드로 실행한다. docker ps 를 통해 잘 빌드된 후 실행중인지 확인한다.


Docker Compose로 flask와 redis 연동해보기

위에서는 기본기를 위해 docker compose로 mysql만 빌드했다. 이번에는 파이썬을 이용한 간단한 flask 웹api를 만들고 redis 데이터베이스를 연동시켜본다.

작성할 내용들은 도커 공식문서에 모두 기입되어있는 내용들이다.


docker-compose.yml

services:
  web:
    build: .  # 현재 디렉토리의 Dockerfile을 사용하여 빌드한다.
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

총 2개의 서비스를 정의한다.

  • web : ‘web’ 이름의 서비스를 정의한다.
    • build : 현재 디렉토리의 Dockerfile를 통해 빌드된 이미지를 사용한다.
    • ports : 호스트의 8000포트를 해당 서비스의 5000포트로 매핑한다.
  • redis : redis 라는 이름의 서비스를 정의한다.
    • image : redis:alpine 이미지를 사용한다.

Dockerfile

docker-compose.yml에서 web 서비스는 현재 디렉토리의 Dockerfile을 통해 빌드된 이미지를 사용하도록 지정했다. web서비스에서 사용할 이미지를 빌드할 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"]

요약하자면 파이썬 이미지를 사용하여 Flask 웹 서비스를 생성한다.

작업 디렉토리는 컨테이너의 /code 경로를 사용한다.

환경변수를 설정해 메인 애플리케이션 파일과 호스트 IP를 모든 IP 를 허용시킨다.

현재 디렉토리의 requirements.txt 파일에 컨테이너 내부에서 설치할 목록을 작성하고 해당 파일을 작업 디렉토리로 복사한다. 복사된 파일을 읽어 설치를 진행한다.

  • FROM : 파이썬 이미지를 사용한다.
  • WORKDIR : 작업 디렉토리로 컨테이너의 /code 디렉토리를 사용한다.
  • ENV : Flask와 관련된 환경변수들을 설정한다.
  • RUN : 컨테이너가 실행되면 실행할 명령어를 작성한다.
  • COPY : 현재 디렉토리의 requirements.txt 파일을 복사해 WORKDIR로 지정한 컨테이너의 경로에 붙여넣는다.
  • RUN : 작업 디렉토리에 있는 requirements.txt 파일에 적혀있는 내용들을 해당 컨테이너에 설치한다.
  • EXPOSE : 5000번 포트에서 대기하도록 설정한다.
  • COPY : 현재 디렉토리의 내용을 모두 컨테이너의 작업 디렉토리로 복사한다.
  • CMD : flask 를 실행할 명령어를 작성한다.

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)

/ url을 호출하면 redis 데이터베이스를 사용해서 몇번 호출됬는지 보여주는 간단한 웹 코드이다.

(해당 코드는 Dockercompose 공식문서에 예시로 나와있는 코드를 일부 수정한것이다.)

docker-compose up -d 명령어를 통해 도커 컴포즈를 실행하고 docker ps 를 통해 실행된 컨테이너를 확인한다.

localhost:8000(docker-compose.yml에서 포트포워딩했다)을 호출해보면 Redis 데이터베이스를 이용해서 몇번 방문했는지 알려주는 문구가 표시된다.

메타코딩 유튜브의 Docker 강의를 듣고 요약한 내용입니다. (강의 적극 추천)

0개의 댓글