[Docker] 도커 다루기 : 명시적으로 여러개의 컨테이너 관리하기
도커 컴포즈 : 명시적으로 여러개의 컨테이너 관리하기
1. 도커 컴포즈 (Docker Compose) 소개
-
단일 서버에서 여러 컨테이너를 프로젝트 단위로 묶어서 관리
docker-compose.yml YAML 파일을 통해 명시적으로 관리 -
주요기능
- 프로젝트 단위로 도커 네트워크와 볼륨을 관리
- 프로젝트 내 서비스 간 의존성 정의
- 프로젝트 내 서비스 디스커버리 자동화
- 손 쉬운 컨테이너 수평 확장
2. 프로젝트 / 서비스 / 컨테이너
- 프로젝트(Project)
- docker-compose.yaml 에서 구성하는 프로젝트 명세 내용
- 도커 컴포즈에서 다루는 워크스페이스 단위.
- 함께 관리하는 서비스 컨테이너의 묶음.
- 프로젝트 단위로 기본 도커 네트워크가 생성 됨.
- 서비스(Services)
- 도커 컴포즈에서 컨테이너를 관리하기 위한 단위.
- scale을 통해 서비스 컨테이너의 수 확장 가능.
- 컨테이너(Containers)
- 서비스를 통해 컨테이너 관리.
3. docker-compose.yml
-
version, services, networks, volumes 총 4개의 최상위 옵션
- 버전 (version)
- 가능한 최신 버전 사용 권장
- 도커 엔진 및 도커 컴포즈 버전에 따른 호환성 매트릭스 참조
-
cf) 버전 3 부터 도커 스웜(Docker Swarm)과 호환
-> Swarm 서비스를 docker-compose.yml로 정의 가능
-> docker-compose.yml의 옵션 가운데 docker swarm에서 사용가능한 옵션인지 아닌지 구분 필요! - 도커 스웜(Docker Swarm)
- 여러 서버를 기반으로 스웜 클러스터를 형성하여 컨테이너를 관리하는
컨테이너 오케스트레이션 시스템. - 쿠버네트스와 동일한 목적으로 만들어 졌지만 인기가 쿠버네티스만 못함
- 여러 서버를 기반으로 스웜 클러스터를 형성하여 컨테이너를 관리하는
-
서비스 (Services)
- 네트웍스 (networks)
- default 옵션이 있음
- 볼륨 (volumes)
4. docker-compose 명령어
- docker-compose 명령어 : 프로젝트 목록
# 실행중인 프로젝트 목록 확인
$ docker-compose ls
# 전체 프로젝트 모록 확인
$ docker-compose ls -a
- docker for windows
PS C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build> docker-compose -p my-project up -d
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 3/3
- Network my-project_default Created 0.8s
- Container my-project-web-1 Started 1.7s
- Container my-project-redis-1 Started 1.7s
PS C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build> docker-compose ls
NAME STATUS CONFIG FILES
my-project running(2) C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build\docker-compose.yml
PS C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build> docker-compose ls -a
NAME STATUS CONFIG FILES
build exited(2) C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build\docker-compose.yml
my-project running(2) C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build\docker-compose.yml
- docker-compose 명령어 : 실행 및 종료
# Foreground로 도커 컴포즈 프로젝트 실행
$ docker-compose up
# Background로 도커 컴포즈 프로젝트 실행
$ docker-compose up -d
# 프로젝트 이름 my-project로 변경하여 도커 컴포즈 프로젝트 실행
$ docker-compose up -p my-project -d
# 프로젝트 내 컨테이너 및 네트워크 종료 및 제거
$ docker-compose down
# 프로젝트 내 컨테이너, 네트워크 및 볼륨 종료 및 제거
$ docker-compose down -v
- docker-compose 명령어 : 서비스 확장
# 'web'이라는 서비스를 3개로 확장, 같은 서비스가 3개로 확장되어 실행
$ docker-compose up --scale web=3
-
조건 1 : 호스트 port 번호를 셋팅하면 안된다. -> 충돌 발생
-
docker for windows
PS C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build> docker-compose -p my-project up --scale web=3 -d
[+] Running 4/4
- Container my-project-redis-1 Running 0.0s
- Container my-project-web-3 Started 12.6s
- Container my-project-web-2 Started 13.1s
- Container my-project-web-1 Started 13.5s
PS C:\Workspace\docker\fastcampus-devops\3-docker-kubernetes\4-docker-compose\build> docker-compose -p my-project ps
NAME COMMAND SERVICE STATUS PORTS
my-project-redis-1 "docker-entrypoint.s…" redis running 6379/tcp
my-project-web-1 "flask run" web running 0.0.0.0:62351->5000/tcp
my-project-web-2 "flask run" web running 0.0.0.0:62350->5000/tcp
my-project-web-3 "flask run" web running 0.0.0.0:62348->5000/tcp
- docker-compose 명령어 : docker-compose 이벤트 및 상황 확인
# 프로젝트 내 서비스 로그 확인
$ docker-compose logs
# 프로젝트 내 컨테이너 이벤트 확인
$ docker-compose events
# 프로젝트 내 이미지 목록
$ docker-compose images
# 프로젝트 내 컨테이너 목록
$ docker-compose ps
# 프로젝트 내 실행중인 프로세스 목록
$ docker-compose top
- docker-compose.yml 기본적인 문법
# 프로젝트의 버전
version: '3.9'
# 서비스의 목록
services:
# db 서비스
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 서비스
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: {}
5. 주요 사용 목적
- 로컬 개발 환경 구성
- 특정 프로젝트의 로컬 개발 환경 구성 목적으로 사용
- 프로젝트의 의존성(Redis, MySQL, Kafka 등)을 쉽게 띄울 수 있음
- 프로젝트 안에 참여하는 서비스가 얽기고 섥기면 띄우기가 어려워짐
- 자동화된 테스트 환경 구성
- CI/CD 파이프라인 중 쉽게 격리된 테스트 환경을 구성하여 테스트 수행 가능
- 단일 호스트 내 컨테이너를 “선언적” 관리
- 단일 서버에서 컨테이너를 관리할 때 YAML 파일을 통해 선언적으로 관리 가능
Comments