본문 바로가기
IT

[리눅스 기초 #34] "명령어 한 줄로 서버 군단을!" : 도커 컴포즈(Docker Compose)로 멀티 컨테이너 지휘하기

by sunyjiny 2026. 2. 7.
반응형

리눅스 기초 시리즈의 34번째 시간입니다! 지난 시간에는 환경의 혁명이라 불리는 도커(Docker)의 기초 명령어를 통해 컨테이너를 하나씩 띄우는 법을 배웠습니다. 하지만 실제 서비스를 운영하다 보면 웹 서버만 달랑 하나 띄우는 경우는 거의 없습니다. 데이터베이스, 캐시 서버, 백엔드 API 등 여러 개의 컨테이너가 서로 얽혀서 돌아가야 하죠.

이 많은 컨테이너를 매번 수동으로 하나씩 띄우실 건가요? 오늘은 복잡한 서버 구성을 단 하나의 설정 파일로 관리하는 도커 컴포즈(Docker Compose)의 마법을 저의 생생한 경험담과 함께 정리해 보겠습니다.


1. 나의 경험담: "꼬여버린 컨테이너 네트워크와의 사투"

최근 제 블로그 sunyjini.com의 성능 개선을 위해 웹 서버와 별도로 데이터베이스(MySQL)와 캐시 서버(Redis)를 도입하기로 했습니다. 처음에는 의기양양하게 docker run 명령어를 세 번 입력해서 각각 띄웠죠. 하지만 문제는 그다음에 터졌습니다. 웹 서버가 데이터베이스를 찾지 못하는 것이었습니다.

각 컨테이너의 IP가 매번 바뀌고, 네트워크를 수동으로 연결해주는 과정이 너무나 복잡했습니다. 한참을 삽질하던 중 도커 컴포즈를 만났고, YAML 파일 하나에 모든 설정을 기록해두니 거짓말처럼 모든 컨테이너가 서로를 알아보고 통신하기 시작했습니다. 인프라를 '코드로 관리한다(IaC)'는 것이 얼마나 강력한지 온몸으로 체감한 순간이었습니다.


2. Before: 수동으로 명령어를 나열하던 고된 노동

도커 컴포즈를 몰랐을 때는 메모장에 수십 줄에 달하는 docker run 옵션들을 적어두고 복사 붙여넣기를 반복해야 했습니다. 명령어 순서가 바뀌거나 포트 번호를 하나만 잘못 적어도 시스템 전체가 꼬여버렸죠.

비효율적인 수동 실행의 예:

Bash Terminal
 
# DB 띄우고... docker run --name my-db -e MYSQL_ROOT_PASSWORD=password -d mysql

웹 서버 띄우면서 DB 연결해주고... (옵션이 끝도 없음)
docker run --name my-web --link my-db:db -p 80:80 -d my-app-image

"아... 포트 설정을 빼먹었네? 처음부터 다시..."

(▲ Before: 사람이 직접 관리하기엔 실수가 너무 잦고 비효율적인 방식이었습니다. 서버가 10대, 100대로 늘어난다고 생각하면 끔찍했죠.)


3. Action: docker-compose.yml로 군단 지휘하기

이제 YAML 파일 하나로 모든 환경을 정의하고, 명령어 한 줄로 모든 서비스를 동시에 가동해 보겠습니다.

지휘 파일 (docker-compose.yml):

YAML
 
version: '3.8' services: web: image: nginx ports: - "80:80" depends_on: - db db: image: mysql environment: MYSQL_ROOT_PASSWORD: password 

(▲ Action: docker-compose up -d 명령어 하나면 파일에 적힌 모든 서비스가 순서대로(depends_on) 살아납니다. 이제 우리는 개별 컨테이너가 아닌 '서비스 전체'를 관리하게 된 것입니다.)


4. After: 쾌적해진 인프라 관리 (생산성 혁명)

도커 컴포즈를 도입한 뒤 제 개발 생활은 놀라울 정도로 쾌적해졌습니다. 새로운 팀원이 합류해도 git clonedocker-compose up만 알려주면 1분 만에 저와 똑같은 개발 환경이 세팅됩니다.

달라진 점들:

  • 문서화와 자동화: YAML 파일 자체가 인프라 명세서가 되어 별도의 문서 없이도 서버 구조를 파악할 수 있습니다.
  • 네트워크 통합: 컴포즈가 자동으로 전용 네트워크를 만들어주어 컨테이너끼리 서비스 이름으로 통신이 가능해졌습니다.
  • 일관성 유지: 개발, 테스트, 운영 환경을 거의 동일하게 유지할 수 있어 배포 시 에러가 획기적으로 줄었습니다.

5. 실험 요약 및 팁

명령어 역할 비유
docker-compose up -d 설정대로 서비스 시작(백그라운드) 연주 시작 신호 보내기
docker-compose down 서비스 중지 및 네트워크 삭제 공연 마치고 무대 정리하기
docker-compose logs -f 모든 컨테이너 로그 실시간 확인 전체 상황 실시간 모니터링
docker-compose restart 모든 서비스 재시작 전열 재정비하기

6. 마치며: 당신의 서버 군단은 준비되었나요?

리눅스 기초 34단계를 거치며 우리는 이제 개별 컨테이너를 넘어 전체 시스템을 조율하는 마에스트로가 되었습니다. 도커 컴포즈는 복잡한 인프라를 한 장의 종이에 설계하고 그대로 현실로 구현하는 가장 우아한 방법입니다.

오늘의 인사이트: "복잡함을 다루는 최고의 방법은 그것을 코드로 정의하고 자동화하는 것이다."


34번째 이야기를 마칩니다. 이제 우리만의 '컨테이너 함대'가 완벽하게 정렬되었습니다. 다음 시간에는 이 함대들을 지키고 모니터링하는 **'리눅스 방화벽(UFW)과 보안 기본 설정으로 내 서버 요새화하기'**에 대해 다뤄보겠습니다.

이 글이 여러분의 멀티 컨테이너 관리에 큰 도움이 되었나요? 혹시 YAML 파일의 들여쓰기 오류로 고생하고 계신가요?

에러 없는 docker-compose.yml 작성을 위한 린트(Lint) 도구 활용법을 다음 포스팅 부록으로 준비해 드릴까요?

반응형