컨테이너 시대를 살고 있는 우리에게 Docker는 이제 너무나 익숙한 이름입니다. 그리고 여러 개의 컨테이너를 함께 정의하고 실행해야 할 때, 우리는 자연스럽게 Docker Compose를 떠올리곤 합니다. 하지만 혹시 눈치채셨나요? 과거 docker-compose
라는 별도의 바이너리 명령어였다면, 이제는 docker compose
라는 형태로 Docker CLI의 한 부분으로 통합되어 사용되고 있다는 사실을요! 🚀
이 글에서는 Docker Compose가 어떻게 docker compose
플러그인으로 진화했는지, 왜 이런 변화가 일어났는지, 그리고 이 강력한 도구를 어떻게 활용할 수 있는지에 대해 상세하게 알아보겠습니다.
1. 도커 컴포즈 플러그인이란? (What is Docker Compose Plugin?)
기존의 docker-compose
는 파이썬(Python)으로 개발된 별도의 독립 실행형 애플리케이션이었습니다. 여러분이 docker-compose up
명령을 실행하면, 시스템에 설치된 docker-compose
바이너리가 실행되어 docker-compose.yml
파일을 해석하고 Docker Engine API와 통신하여 컨테이너들을 관리했습니다.
하지만 이제 docker compose
플러그인은 Docker CLI의 기본 서브 커맨드 중 하나로 통합되었습니다. 즉, 더 이상 외부 명령어가 아닙니다. 여러분이 docker run
, docker build
를 사용하듯이, docker compose
도 docker
명령어 뒤에 붙여 사용하는 방식이 된 것이죠. 이는 Go 언어로 재작성되어 Docker CLI와 동일한 기반 위에서 동작합니다.
💡 핵심 요약:
- 이전:
docker-compose [명령어]
(별도 바이너리) - 현재:
docker compose [명령어]
(Docker CLI의 내장 플러그인)
2. 왜 플러그인으로 바뀌었을까요? (Why the Change?)
이러한 변화에는 몇 가지 중요한 이유가 있습니다.
2.1. 일관성과 통합 (Consistency & Integration) 🤝
Docker는 여러 기능을 플러그인 형태로 확장하고 통합하는 방향으로 나아가고 있습니다. docker compose
를 플러그인으로 만들면서, 사용자는 docker
라는 하나의 일관된 접두사 아래에서 모든 Docker 관련 작업을 수행할 수 있게 되었습니다. 이는 사용자 경험을 단순화하고, 명령어 사용의 혼란을 줄여줍니다.
2.2. 성능 향상 (Performance Improvement) ⚡
기존의 파이썬 기반 docker-compose
는 시작 시간이 상대적으로 길거나 리소스를 더 많이 사용하는 경향이 있었습니다. Go 언어로 재작성된 docker compose
플러그인은 훨씬 빠르고 효율적으로 동작합니다. 이는 특히 대규모 프로젝트에서 많은 컨테이너를 관리할 때 체감할 수 있는 장점입니다.
2.3. 유지보수 및 개발 용이성 (Easier Maintenance & Development) 🛠️
Go 언어는 Docker 생태계의 핵심 언어입니다. docker compose
를 Go로 전환함으로써 Docker Core 팀은 기존의 Docker Engine 및 CLI와 동일한 언어 및 도구 체인으로 Compose 기능을 유지보수하고 개발할 수 있게 되었습니다. 이는 버그 수정 및 새로운 기능 추가를 더욱 신속하게 만듭니다.
2.4. 설치의 편리성 (Simpler Installation) ✅
대부분의 최신 Docker Desktop 버전(Windows, macOS)이나 Docker Engine 설치 시 docker compose
플러그인이 기본으로 포함되어 제공됩니다. 별도로 pip
등으로 docker-compose
를 설치할 필요가 없어졌습니다.
3. 주요 기능 및 장점 (Key Features & Advantages)
docker compose
플러그인은 기존 docker-compose
가 제공하던 모든 핵심 기능을 그대로 계승하며, 위에 언급된 장점들을 추가합니다.
- 동일한
docker-compose.yml
파일 형식 지원: 기존에 사용하던 YAML 파일은 변경 없이 그대로 사용할 수 있습니다. 이는 마이그레이션 부담을 없애줍니다. - 직관적인 컨테이너 오케스트레이션: 하나의 명령어로 여러 컨테이너를 빌드, 시작, 중지, 삭제할 수 있습니다.
- 환경 격리: 각 프로젝트별로 독립적인 컨테이너 환경을 구축하여 의존성 충돌을 방지합니다.
- 확장성 및 유연성: 서비스 정의, 네트워크, 볼륨 등을 YAML 파일에 명확하게 정의하여 복잡한 애플리케이션 스택도 쉽게 관리할 수 있습니다.
4. 어떻게 사용하나요? (How to Use It?)
사용법은 기존 docker-compose
와 거의 동일하며, 명령어 앞에 docker
만 붙여주면 됩니다.
4.1. 설치 확인하기
대부분의 최신 Docker Desktop 사용자나 apt
또는 yum
으로 Docker Engine을 설치한 Linux 사용자라면 이미 docker compose
플러그인이 설치되어 있을 것입니다. 다음 명령어로 버전을 확인해 보세요.
docker compose version
만약 설치되어 있지 않다면, Docker 공식 문서를 참고하여 설치해야 합니다. (Docker Desktop을 설치하는 것이 가장 간편합니다.)
4.2. 간단한 예제 프로젝트 실습하기
간단한 웹 애플리케이션(Flask)과 데이터베이스(Redis)를 docker compose
로 실행하는 예제를 통해 사용법을 익혀봅시다.
먼저, 다음과 같은 파일들을 생성합니다.
my_flask_app/
├── app.py
├── Dockerfile
├── requirements.txt
└── docker-compose.yml
1. app.py
(Flask 애플리케이션)
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379) # 서비스 이름 'redis'로 연결
@app.route('/')
def hello():
count = redis.incr('hits')
return f'Hello Docker! This page has been viewed {count} times.\n'
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
2. requirements.txt
flask
redis
3. Dockerfile
(Flask 애플리케이션 빌드용)
FROM python:3.9-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
4. docker-compose.yml
(가장 중요!)
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/app # 호스트의 현재 디렉토리를 컨테이너의 /app에 마운트
depends_on:
- redis
environment:
FLASK_ENV: development
# Flask 앱을 다시 시작하지 않고도 코드 변경 사항을 반영하려면 아래 줄의 주석을 해제하세요.
# command: flask run --host=0.0.0.0 --port=5000 --debug --reload
redis:
image: "redis:alpine" # 공식 Redis 이미지 사용
ports:
- "6379:6379" # 로컬 6379 포트를 컨테이너 6379 포트에 연결
4.3. docker compose
명령어 사용하기
이제 my_flask_app
디렉토리로 이동하여 다음 명령어를 실행합니다.
1. 서비스 빌드 및 실행 (백그라운드)
cd my_flask_app
docker compose up -d
up
:docker-compose.yml
파일에 정의된 서비스를 생성하고 시작합니다.-d
: (detached mode) 컨테이너를 백그라운드에서 실행합니다.
2. 실행 중인 서비스 확인
docker compose ps
이 명령어를 통해 web
과 redis
서비스의 상태를 확인할 수 있습니다.
출력 예시:
NAME COMMAND SERVICE STATUS PORTS
my_flask_app-redis-1 "docker-entrypoint.s…" redis running 0.0.0.0:6379->6379/tcp
my_flask_app-web-1 "python app.py" web running 0.0.0.0:5000->5000/tcp
3. 웹 애플리케이션 접속
이제 웹 브라우저를 열고 http://localhost:5000
으로 접속해 보세요. 페이지를 새로고침 할 때마다 “Hello Docker! This page has been viewed N times.” 메시지의 숫자가 증가하는 것을 볼 수 있습니다. 이는 Flask 앱이 Redis 데이터베이스와 성공적으로 통신하고 있음을 의미합니다.
4. 서비스 로그 확인
docker compose logs web
web
서비스의 로그를 실시간으로 확인할 수 있습니다. redis
서비스의 로그를 보려면 docker compose logs redis
를 사용하면 됩니다.
5. 서비스 중지 및 삭제 작업이 끝났다면, 다음 명령어로 실행 중인 컨테이너들을 중지하고 삭제할 수 있습니다.
docker compose down
down
:up
으로 시작된 서비스들을 중지하고 정의된 네트워크와 볼륨을 제거합니다.
5. 자주 사용하는 docker compose
명령어 (Common Commands)
명령어 | 설명 |
---|---|
docker compose up |
docker-compose.yml 에 정의된 모든 서비스를 빌드하고 시작합니다. |
docker compose up -d |
모든 서비스를 백그라운드(detached mode)에서 시작합니다. |
docker compose down |
실행 중인 모든 서비스를 중지하고 컨테이너, 네트워크, 볼륨을 제거합니다. |
docker compose ps |
실행 중인 서비스들의 상태를 표시합니다. |
docker compose logs [서비스명] |
특정 서비스의 로그를 표시합니다. (예: docker compose logs web ) |
docker compose build |
서비스 이미지들을 빌드합니다. (이후 up 시 재빌드를 피할 수 있습니다.) |
docker compose exec [서비스명] [명령어] |
실행 중인 특정 서비스 컨테이너 내부에서 명령어를 실행합니다. (예: docker compose exec web bash ) |
docker compose restart [서비스명] |
특정 서비스를 재시작합니다. |
docker compose pull |
docker-compose.yml 에 정의된 모든 서비스의 이미지들을 미리 다운로드합니다. |
docker compose config |
docker-compose.yml 파일의 유효성을 검사하고 최종 병합된 설정을 출력합니다. |
6. 심화 활용 팁 (Beyond the Basics) 💡
- 여러 개의 Compose 파일 사용하기 (
-f
): 개발, 스테이징, 프로덕션 환경마다 다른 설정을 적용하고 싶을 때 유용합니다.docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
- 환경 변수 활용:
docker-compose.yml
파일 내에서$VAR_NAME
형태로 환경 변수를 참조할 수 있으며,.env
파일을 사용하여 변수를 관리할 수 있습니다.# .env 파일 내용 DB_PASSWORD=mysecretpassword
# docker-compose.yml에서 사용 services: db: environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
- 프로필 (Profiles):
하나의
docker-compose.yml
파일 안에 여러 서비스 그룹을 정의하고 필요에 따라 특정 그룹만 실행할 수 있습니다.services: frontend: profiles: ["dev"] # ... backend: profiles: ["dev", "prod"] # ... admin: profiles: ["prod"] # ...
docker compose --profile dev up # dev 프로필에 속한 서비스만 실행
extends
키워드로 설정 재사용: 반복되는 서비스 정의를 줄이고 재사용성을 높일 때 사용합니다.
결론 (Conclusion)
docker compose
플러그인은 Docker 컨테이너 오케스트레이션의 미래를 보여줍니다. 기존의 강력한 기능을 유지하면서도, Docker CLI와의 깊은 통합, 향상된 성능, 그리고 더 편리한 사용성을 제공합니다. 이제 docker compose
는 개발 환경에서부터 단일 호스트 배포에 이르기까지, 여러 컨테이너 애플리케이션을 관리하는 데 있어 더욱 견고하고 필수적인 도구가 되었습니다.
이 글을 통해 docker compose
플러그인에 대한 이해를 높이고, 여러분의 컨테이너 개발 및 배포 워크플로우를 더욱 효율적으로 개선하는 데 도움이 되기를 바랍니다. 궁금한 점이 있다면 언제든지 댓글로 질문해주세요! Happy containerizing! 🐳✨