Docker Compose는 YAML 파일을 사용하여 애플리케이션의 서비스, 네트워크, 볼륨 등의 구성을 정의한다.
DockerCompose를 이용하여 MySQL 컨테이너 하나를 만들어본다.
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 up -d
명령어를 사용하여 docker-compose.yml 파일을 통해 컨테이너를 빌드하고 백그라운드로 실행한다. docker ps 를 통해 잘 빌드된 후 실행중인지 확인한다.
위에서는 기본기를 위해 docker compose로 mysql만 빌드했다. 이번에는 파이썬을 이용한 간단한 flask 웹api를 만들고 redis 데이터베이스를 연동시켜본다.
작성할 내용들은 도커 공식문서에 모두 기입되어있는 내용들이다.
services:
web:
build: . # 현재 디렉토리의 Dockerfile을 사용하여 빌드한다.
ports:
- "8000:5000"
redis:
image: "redis:alpine"
총 2개의 서비스를 정의한다.
web : ‘web’ 이름의 서비스를 정의한다.build : 현재 디렉토리의 Dockerfile를 통해 빌드된 이미지를 사용한다.ports : 호스트의 8000포트를 해당 서비스의 5000포트로 매핑한다.redis : redis 라는 이름의 서비스를 정의한다.image : redis:alpine 이미지를 사용한다.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 를 실행할 명령어를 작성한다.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 강의를 듣고 요약한 내용입니다. (강의 적극 추천)