
도커 컴포즈(Docker Compose)
대부분의 현대 애플리케이션은 여러개의 서비스 묶음으로 이루어져 있습니다. 대표적으로 웹 서비스를 예시로 생각해 보면 웹서버/DB/백앤드... 등 여러개의 서비스의 집합이라 볼 수 있는데 도커를 통해 실행환경을 구성할 경우 각각의 서비스를 컨테이너로 만들어 실행하여야 합니다.
단일 컨테이너 애플리케이션에서는 문제가 되지 않지만, 여러 컨테이너가 묶인 서비스나 컨테이너별로 복잡한 환경 설정(포트, 볼볼륨, 네트워크 , 환경 변수 등)이 필요한 경우, 개발자는 다음과 같은 반복적인 작업으로 인해 피로감을 느끼게 됩니다.
도커 컴포즈는 이러한 문제를 해결하기 위해 등장했습니다. 도커 컴포즈는 YAML 파일 하나에 애플리케이션을 구성하는 모든 컨테이너 서비스 정의와 복작한 환경 설정을 코드화 하여, 매번 일일이 docker run 명령어나 환경변수를 입력할 필요 없이, 서비스 스택을 쉽게 정의하고 실행&관리할 수 있게 해줍니다.
도커 컴포즈 설치
먼저 명령어를 통해 docker compose의 설치 여부를 확인해 줍니다. 도커 컴포즈는 V1 / V2 두가지 유형이 존재하기 때문에(둘 중에 하나만 있으면 가능) 구분에 따라 아래 명령어를 통해 설치 여부 및 버전을 확인할 수 있습니다.
#docker compose V1 버전 확인
docker-compose --version
#docker compose V2 버전 확인
docker compose version
도커 컴포즈 V1(레거시)은 도커 CLI와 별도의 파이썬 기반 라이브러리 였습니다. 하지만 최신 도커 에는 도커 엔진 설치 시 도커 컴포즈 v2가 내장되어 있는 경우가 많습니다. 기존에 설치된 도커 엔진에 docker compose가 포함되어 있지 않은 경우 V1을 설치, 최신 버전의 경우 내장된 도커 컴포즈를 사용하면 됩니다.
curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
도커 컴포즈 V1과 V2를 비교하면 아래와 같습니다. 두가지 모두 역할은 동일하지만, V2의 경우 도커 엔진 내부에 포함되어 있어 CLI 명령어 규칙이 다른 명령어 들과 일관성이 있어 V2 사용을 권장합니다
| 구분 | 도커 컴포즈(V1) | 도커 컴포즈(V2) |
| 실행 방식 | 별도의 파이썬 기반 라이브러리 | 도커 CLI 플러그인 |
| 명령어 | docker-compose up | docker compose up('-' 하이폰 제거로 통일성) |
| 설치 경로 | 별도의 경로에 설치 | docker 바이너리로 내장 |
도커 컴포즈 YAML 작성
도커 컴포즈는 yml 파일로 구성합니다. 서비스 묶음 별로 docker-compose.yml 파일을 작성하여 관리한는 경우가 일반적이며, 꼭 파일명을 docker-compose로 지정할 필요는 없습니다.
Outline이라는 Notion과 같은 프로젝트 관리 SASS 서비스 설치 예시를 통해 docker-compose.yml 작성을 살펴보겠습니다. Outline을 도커 환경에서 구현하기 위해선, outline, nginx 웹서버, postgresSQL , redis 설치가 필요합니다. 도커 컴포즈가 없다면 각각의 컨테이너들을 따로 docker run 명령어 + 환경변수 파라미터의 조합으로 실행해야 하겠지만, 도커 컴포즈를 사용한다면 docker-compose.yml 파일 하나로 아래와 같이 명시할 수 있습니다.
version: '3.8'
services:
# Nginx 추가
nginx:
image: nginx:alpine
container_name: outline-nginx
ports:
- "10002:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- outline
networks:
- outline-network
restart: unless-stopped
# Outline (ports 부분만 주석처리)
outline:
image: outlinewiki/outline:latest
container_name: outline
env_file:
- ./.env
environment:
- NODE_ENV=production
- NODE_TLS_REJECT_UNAUTHORIZED=0
# ports: # 이 부분 주석처리!
# - "10002:3000"
user : 1000:1000
volumes:
- /home/strkorea/docker-volume/outline/outline-storage:/var/lib/outline/data
depends_on:
- postgres
- redis
networks:
- outline-network
restart: unless-stopped
postgres:
image: postgres:14-alpine
container_name: postgres
env_file:
- ./.env
volumes:
- /home/strkorea/docker-volume/outline/postgres-data:/var/lib/postgresql/data
networks:
- outline-network
restart: unless-stopped
redis:
image: redis:7-alpine
container_name: redis
networks:
- outline-network
restart: unless-stopped
networks:
outline-network:
driver: bridge
도커 컴포즈 YAML 구성요소
[도커 컴포즈 YAML 작성] 에서 예시를 간단히 살펴보았습니다. 다음으로, 파일 내 핵심 요소(옵션)들을 살펴보겠습니다.
project
docker-compose.yml 파일에 명시되어 있는 옵션은 아니지만, docker-compose 내 컨테이너의 prefix 입니다.
version
docker-compose.yml 파일의 버전입니다.
service
docker-compose.yml 파일을 통해 제어하고자 하는 컨테이너를 명시합니다.
images
컨테이너가 사용할 이미지를 명시합니다.
build
컨테이너를 기동하기 전 빌드를 진행하는 경로를 기술합니다.
ports
컨테이너 외부와 내부로의 노출시킬 포트를 매핑하는 옵션입니다.
volumes
도커 볼륨 혹은 호스트 볼륨을 마운트 하여 볼륨을 지정하는 옵션입니다.
networks
컨테이너가 소속된 네트워크를 지정합니다. 같은 서비스 묶음 내 컨테이너는 같은 네트워크에 있어야 통신이 가능합니다.
'방법론과 DevOps > Docker' 카테고리의 다른 글
| 도커와 방법론 (0) | 2025.05.23 |
|---|---|
| 도커 가상 네트워크 (0) | 2025.05.20 |
| 멀티 스테이지 빌드 (0) | 2025.05.15 |
| 도커파일 지시어 (1) | 2025.05.14 |
| 이미지 빌드 (0) | 2025.05.14 |