오케스트레이션의 시작: Docker Compose와 필수 명령어
여러 컨테이너를 하나의 파일로 관리하는 Docker Compose의 원리와, 자주 쓰이는 핵심 명령어(up, down, logs, ps, exec)를 익힙니다.
지금까지 우리는 하나의 컨테이너를 띄우기 위해 `docker run` 명령어를 사용해 왔습니다. 포트를 매핑하고, 볼륨을 연결하고, 환경 변수를 주입하다 보니 명령어가 점점 길고 복잡해졌습니다.
만약 프론트엔드, 백엔드 API 서버, 데이터베이스, 이렇게 세 개의 컨테이너를 동시에 띄워야 한다면 어떨까요? 길고 긴 명령어를 터미널 창 세 개를 열어 각각 입력해야 할 것입니다. 컴퓨터를 재부팅하면 이 짓을 또 해야 합니다.
이런 고통에서 벗어나게 해주는 마법 같은 도구가 바로 도커 컴포즈(Docker Compose)입니다. 여러 컨테이너를 하나의 주문서(YAML)로 묶어서 클릭 한 번, 명령어 한 번에 껐다 켰다 할 수 있게 해주는 오케스트레이션 도구를 만나봅시다.
도커 컴포즈란 무엇인가?
도커 컴포즈는 여러 개의 컨테이너 설정을 `docker-compose.yml`이라는 하나의 텍스트 파일에 미리 다 적어두고, 이 파일을 바탕으로 시스템 전체를 통째로 관리하는 도구입니다.
명령어의 선언적 전환 (명령어에서 주문서로)
터미널에 길게 치던 `docker run` 명령어는 "이렇게 실행해!"라고 하나하나 명령을 내리는 방식(명령형)입니다. 반면 `docker-compose.yml`은 "내가 원하는 서버 구성은 이거야. 알아서 만들어 줘!"라고 주문서를 던지는 방식(선언적)입니다.
Docker Compose의 구조 (Services)
- frontend
- 사용자가 접속할 화면을 제공하는 컨테이너 (예: Next.js)
- backend
- 비즈니스 로직을 처리하는 API 컨테이너 (예: Go, Node.js)
- database
- 데이터를 영구적으로 저장하는 DB 컨테이너 (예: PostgreSQL)
도커 컴포즈 파일 안에는 위와 같은 여러 개의 서비스(Service)들을 나열하고, 각각 어떤 포트를 열지, 어떤 환경 변수를 쓸지 미리 다 적어둡니다.
docker-compose.yml 파일 맛보기
아직 문법을 다 외울 필요는 없습니다. 대략 어떤 형태로 생겼는지만 눈에 익혀두세요.
version: '3.8'
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: postgres:15
environment:
- POSTGRES_PASSWORD=secret
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:위 주문서를 보면, `web`이라는 Nginx 서버와 `db`라는 PostgreSQL 서버가 선언되어 있습니다. 포트 매핑(`ports`)과 볼륨(`volumes`), 환경 변수(`environment`) 설정도 예쁘게 정리되어 있습니다.
도커 컴포즈의 핵심 필수 명령어 5가지
`docker-compose.yml` 파일이 있는 폴더에서 터미널을 열고, 아래 명령어들을 사용해 모든 컨테이너를 지휘할 수 있습니다. 바이브코딩을 할 때 이 5가지 명령어만 알면 웬만한 상황은 다 대처할 수 있습니다.
1. `docker compose up` (실행하기)
이 주문서에 적힌 모든 컨테이너를 한꺼번에 생성하고 실행합니다.
- `docker compose up -d`를 사용하면 백그라운드에서 조용히 실행됩니다. (-d는 detached 모드입니다.)
2. `docker compose down` (종료 및 정리하기)
실행 중인 모든 컨테이너를 중지하고 깔끔하게 삭제합니다.
- 도커 컴포즈가 알아서 만들었던 네트워크도 함께 정리해 줍니다. 매우 깔끔하게 시스템을 끄는 방법입니다.
3. `docker compose logs` (로그 확인하기)
서버에 에러가 났을 때 가장 먼저 쳐야 할 명령어입니다.
- `docker compose logs -f`를 치면, 터미널 화면에 실시간으로 찍히는 로그를 계속해서(follow) 보여줍니다. (종료할 때는 Ctrl+C)
- `docker compose logs -f web`처럼 서비스 이름을 뒤에 붙이면 특정 컨테이너의 로그만 볼 수 있습니다.
4. `docker compose ps` (상태 확인하기)
현재 도커 컴포즈로 띄워진 컨테이너들의 상태(실행 중인지, 꺼졌는지)와 매핑된 포트 정보를 한눈에 보여줍니다.
5. `docker compose exec` (컨테이너 내부로 들어가기)
실행 중인 특정 컨테이너 안에 들어가서 명령어를 쳐야 할 때 사용합니다. 예를 들어 DB 컨테이너 안에 들어가서 직접 쿼리를 날려보고 싶을 때 유용합니다.
- 예: `docker compose exec db bash` (db 컨테이너 안에 bash 쉘로 접속)
개발 시 흔히 반복되는 컴포즈 루틴
- 1아침에 출근하여 docker compose up -d 로 모든 로컬 서버를 띄운다.
- 2개발 중 에러가 나면 docker compose logs -f 로 로그를 모니터링한다.
- 3설정 파일(yaml)을 수정했다면 docker compose down 으로 내린 뒤 다시 up 시킨다.
- 4퇴근할 때 컴퓨터 자원 절약을 위해 docker compose down 으로 서버를 끈다.
개념 퀴즈
퀴즈 답을 맞춰야 학습 완료가 됩니다.docker-compose.yml에 선언된 여러 개의 컨테이너를 백그라운드에서 한 번에 띄우기 위해 사용하는 가장 일반적인 명령어는 무엇인가요?
3줄 요약
- 1도커 컴포즈는 여러 개의 컨테이너를 하나의 YAML 파일로 정의하고 관리할 수 있게 해줍니다.
- 2복잡한 docker run 명령어를 칠 필요 없이, 설정 파일 하나로 실행(up)과 종료(down)를 통제할 수 있습니다.
- 3바이브코딩 시 로그를 실시간으로 확인할 수 있는 docker compose logs -f 명령어는 문제 해결의 핵심입니다.