개발할 때 백엔드 따로, DB 따로, Redis 따로... 매번 각개격파하는 거 너무 귀찮지 않아? 'docker run'만 수십 번 치다가 손가락 부러질 뻔했다고! 이럴 때 우리에게 필요한 건 뭐다? 바로 Docker Compose지! 오늘은 Docker Compose 하나로 여러 컨테이너를 한 방에 띄우는 방법을 알아보자.
1. Docker Compose 파일 만들기
먼저 docker-compose.yml 파일을 만들어야 해. 이 파일이 바로 컨테이너들을 어떻게 구성할지 알려주는 설계도라고 생각하면 돼. 프로젝트 루트에 docker-compose.yml 파일을 만들고 아래처럼 시작해보자.
version: '3.8'
services:
# 여기에 각 서비스(컨테이너)들을 정의할 거야
version은 Docker Compose 파일의 문법 버전을 나타내고, services 아래에 우리가 띄울 컨테이너들을 하나씩 추가할 거야.
2. 서비스 정의하기: 웹 애플리케이션
이제 백엔드 웹 애플리케이션 컨테이너를 정의해보자. 예시로 Node.js 앱을 만들어볼게.
version: '3.8'
services:
webapp:
build: .
ports:
- "3000:3000"
environment:
NODE_ENV: development
DATABASE_URL: postgres://user:password@db:5432/mydb
depends_on:
- db
webapp: 이 서비스의 이름이야. 다른 컨테이너에서 이 이름으로 접근할 수 있어.build: .: 현재 디렉토리의Dockerfile을 사용해서 이미지를 빌드하라는 뜻이야. 만약 이미 만들어진 이미지가 있다면image: your-repo/your-image:tag처럼 쓸 수도 있어.ports: 호스트(내 컴퓨터)와 컨테이너 포트를 연결해줘."호스트포트:컨테이너포트"형식이지.environment: 컨테이너 내부에서 사용할 환경 변수들을 설정할 수 있어.depends_on:db서비스가 먼저 시작되어야webapp이 시작되도록 순서를 지정해주는 거야. 서버가 DB 없이 뜨면 안 되잖아?
3. 서비스 정의하기: 데이터베이스
웹 애플리케이션과 함께 사용할 PostgreSQL 데이터베이스 컨테이너도 정의해보자.
version: '3.8'
services:
webapp:
build: .
ports:
- "3000:3000"
environment:
NODE_ENV: development
DATABASE_URL: postgres://user:password@db:5432/mydb
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
db: 데이터베이스 서비스 이름이야.webapp에서DATABASE_URL에db로 접근하는 걸 볼 수 있지?image: postgres:13:postgres이미지의13버전을 사용할 거야.environment: DB 이름, 사용자, 비밀번호 등 DB 설정을 여기서 해줘.volumes: DB 데이터가 컨테이너가 사라져도 날아가지 않도록 영구 저장 공간을 만들어주는 거야.db-data라는 볼륨을 만들고/var/lib/postgresql/data경로에 연결했어.- 마지막
volumes: db-data:부분은db-data라는 이름의 볼륨을 정의하는 부분이야.
depends_on은 컨테이너 시작 순서만 보장해줘.db컨테이너가 '완전히 준비'될 때까지 기다려주진 않으니, 앱 코드에서 DB 연결 재시도 로직을 넣어주는 게 좋아!
4. Docker Compose 실행
docker-compose.yml 파일 작성이 끝났으면, 이제 프로젝트 루트 디렉토리에서 터미널을 열고 다음 명령어를 입력해보자.
docker compose up -d
up:docker-compose.yml파일에 정의된 모든 서비스를 시작해줘.-d: 컨테이너들을 백그라운드에서 실행하고 터미널 제어권을 돌려받는다는 뜻이야. (detached 모드)
명령어를 실행하면 Docker Compose가 필요한 이미지를 다운로드하고, 정의된 순서대로 컨테이너들을 띄울 거야. 간단하다!
5. 컨테이너 종료 및 삭제
이제 개발을 다 했거나 컨테이너를 재시작하고 싶다면 다음 명령어로 모든 서비스를 한 번에 내릴 수 있어.
docker compose down
down:docker-compose.yml파일에 정의된 모든 컨테이너와 네트워크를 중지하고 제거해줘. 만약-v옵션을 추가하면 볼륨도 함께 삭제돼. (ex:docker compose down -v)
여기까지 하면 끝이다! 이제 여러 컨테이너를 Docker Compose로 손쉽게 관리할 수 있을 거야. 여러 서비스 띄우느라 고생하는 일은 더 이상 없을 거야!