2022. 2. 26. 21:14ㆍDevOps/Docker & kubernetes
도커 컴포즈에 대해 알아보도록 하자. 먼저 도커 컴포즈의 사용목적은 아래와 같다.
로컬 개발 환경 구성 | 특정 프로젝트의로컬 개발 환경 구성 목적으로 사용된다. 프로젝트의 의존성(redis, mysql, kafka 등)을 쉽게 띄울 수 있다. |
자동화된 테스트 환경 구성 | CI/CD 파이프라인 중 쉽게 격리된 테스트 환경을 구성하여 테스트를 수행할 수 있다. |
단일 호스트 내 컨테이너 선언적 관리 | 단일 서버에서 컨테이너를 관리할 때 yaml파일을 통해 선언적으로 관리할 수 있다. |
도커 컴포즈는 도커 서버에서 여러 컨테이너를 프로젝트 단위로 묶어서 사용하는 도구로 사용된다. 지금까지는 단일 서버(우분투)에서 도커 엔진을 사용해서 CLI형식으로 하나씩 도커를 실행했고 관리해 왔었다. 하지만 docker com-pose(도커 컴포즈)를 사용하면 yaml파일을 통해서 컨테이너들을 명시적으로 관리하는것이 가능하며 프로젝트 단위로 묶어서 여러 컨테이너들을 관리해 사용할 수 도 있다. 프로젝트 단위로 도커 네트워크와 볼륨을 관리할 수 있으며, 프로젝트 안에서 서비스 간의 의존성을 정리할 수 있게 된다. 각각의 서비스를 서비스명으로 네트워크 상에서 호출을 할 수 있게 된다(서비스 디스커버리 자동화가 된다). 컨테이너의 수평확장이 굉장히 쉽게 된다.
프로젝트 (Project) |
도커 컴포즈에서 다루는 하나의 워크스페이스의 단위이다. 여러 서비스 컨테이너의 묶음이라고 볼 수 있다. yaml파일(프로젝트를 명세한다) 안에 services안에 여러 서비스가 있고, 이 서비스 1개당 특정 이미지를 통해 정의가 된다. 프로젝트 단위로 기본 도커 네트워크가 생성이 된다. |
서비스 (Service) |
도커 컴포즈에서 컨테이너를 관리하기 위한 단위이다. scale을 통해 서비스 컨테이너의 수를 확장할 수 있다. 예를들어 scale=3이라고 지정한다면 이 서비스는 해당 컨테이너를 3개를 가지게 된다는 의미이다. |
컨테이너 (Container) |
서비스를 통해서 컨테이너를 관리할 수 있다. |
yml의 구조는 아래와 같다.
Docker-compose.yml
yml 파일의 구조
#version, services, networks, volumes 으로 4개 최상위 옵션이 있다.
version: "3.9" # optional since v1.27.0
/ 2022년 2월 기준으로 3.9버전이 최상위 버전이다.
최신버전을 사용하는것을 권장하고 있으며, yml 호환성을 참고해야한다.
호환성 참고 : https://docs.docker.com/compose/compose-file/
* 특이점으로 2와 3은 굉장히 다르며 3부터 docker swarm과 호환이 된다.
해당옵션이 swarm에서 만들어 진것인지 compose에서 사용하는지 명확히 체크해야한다.
/ docker swarm : 쿠버네틱스와 동일한 목적으로(여러대의 서버를 기반으로 클러스터를 형성, 컨테이너를 관리하는)
만들어진 컨테이너 오케스트레이션 시스템이다.
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
/ 프로젝트 내부에 구성되는 다양한 서비스들을 관리할 수 있다.
newtorks:
....
volumes:
logvolume01: {}
/ 프로젝트마다 독립되어 구성되는데 프로젝트 안에서 사용되는 볼륨은 volumes에서 정의하고
네트워크 목록은 네트워크 키 하단에서 정의하면된다.(네트워크는 정의하지 않더라도 default 로 형성된다)
#사용가능한 명령어를 확인할 수 있다.
docker-compose
#실행중인 프로젝트 목록을 확인할 수 있다.(-a의 경우 전체 프로젝트를 확인한다.)
docker-compose ls (-a)
# forerground로 도커 컴포즈 프로젝트를 실행한다.
docker-compose up
# Backround로 도커 컴포즈 프로젝트를 실행한다.
docker-compose up -d
# 프로젝트 이름을 변경하여 도커 컴포즈 프로젝트를 실행한다.
docker-compose -p my-project up -d
# 프로젝트 내 컨테이너 및 네트워크를 종료, 제거한다.
docker-compose down
# 프로젝트 내 컨테이너, 네트워크 및 볼륨을 종료하며 제거한다.
docker-compose down -v
새로운 폴더에 순서대로 app.py dockerfile, docker-compose.yml을 만들도록 하자.
app.py
import redis
from flask import Flask
#redis을 사용했으며 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)
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"]
docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000"
redis:
image: "redis:alpine"
compose의 폴더와 버전을 확인후 up 명령어를 통해 실행하는 모습이다.
도커 컴포즈로 프로젝트를 생성하게 되면은 프로젝트명_default 라는 이름을 가진 브릿지 네트워크가 기본적으로 생성된다. 컨테이너 명의 경우 프로젝트명-서비스명-컨테이너 인덱스(순서) 의 이름으로 명명된다.
-p 명령어를 통해서 컴포즈의 이름을 변경할 수 있으며(화면의 경우 test-my-project로 지정) -d 명령어(백그라운드를 통해 실행한다) 통해 생성했다.
다음으로는 컴포즈를 구축, 제거 해 보기위해 새로운 컴포즈 파일을 만들어 보자. docker-compose.yml파일이다.
version: '3.9'
services:
db:
image: mysql:5.7
volumes:
- db:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=wordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
networks:
- wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
networks:
- wordpress
volumes:
db: {}
networks:
wordpress: {}
up과 down명령어를 통해 잘 실행되는것을 확인할 수 있다.
스케일을 3으로 지정시 3개가 잘 생성된 것을 확인할 수 있다. 여기서 주의점은 도커 컴포즈 옵션 중 호스트 포트를 지정하게 되면 같은 포트를 컨테이너가 사용할려고 하기에 충돌이 발생하여 불가능해 진다. 또한 컨테이너 이름을 지정할 수 있는데, 이 경우에는 컨테이너의 이름이 스케일링이 안 되는 구조이기에 충돌이 발생할 수 있다.
아래의 명령어는 프로젝트 내에서 사용가능한 명령어 이다.
# 프로젝트 내 서비스의 로그를 확인할 수 있다. -f형식의 경우 스트리밍 형식으로 확인 가능하다.
docker-compose logs
# 프로젝트 내 컨테이너 이벤트를 확인할 수 있다.
docker-compose events
# 프로젝트 내 이미지 목록을 확인할 수 있다.
docker-compose images
# 프로젝트 내 컨테이너 목록을 확인할 수 있다.
docker-compose ps
# 프로젝트 내 실행중인 프로세스 목록을 확인할 수 있다.
docker-compose top
'DevOps > Docker & kubernetes' 카테고리의 다른 글
Docker Compose를 이용하여 Grafana와 MySQL구성해 보기 (0) | 2022.02.28 |
---|---|
Docker grafana Error (registry-1.docker.io/v2) (0) | 2022.02.28 |
docker system 명령어와 데몬 디버깅 (0) | 2022.02.25 |
Docker image 경량화 (0) | 2022.02.25 |
Docker Hub 저장소 활용하기 (0) | 2022.01.28 |