[IT-방법] 컴포즈 파일 버전 실전 구축 가이드 – 운영 서버에 바로 적용하는 단계별 절차

컴포즈 파일 버전 지정를 설명하는 실전 구축 가이드 대표 이미지

왜 컴포즈 파일 버전 지정이 운영의 성패를 가를까요?

일요일 밤, 평온하게 쉬고 있는데 서버에서 갑자기 경고 알림이 울립니다. 급히 접속해 확인해보니 컨테이너가 무한 재시작을 반복하고 있어요. 원인을 파악해보니 어제 무심코 업데이트한 도커 엔진 버전과 기존에 작성해둔 docker-compose.yml 파일의 문법이 충돌하며 발생한 문제였습니다.

소규모 서비스를 직접 운영하는 1인 개발자라면 누구나 한 번쯤 겪을 법한 아찔한 순간이에요. 설정 파일의 버전을 명확히 관리하지 않으면, 환경이 조금만 바뀌어도 서비스 전체가 마비될 수 있습니다. 컴포즈 파일 버전 실전 구축은 단순히 숫자를 적는 행위가 아니라, 내 서비스가 어떤 환경에서도 동일하게 동작하도록 보장하는 안전장치를 만드는 과정입니다.

많은 분이 버전 지정 항목을 생략하거나 단순히 최신 버전만 고집하곤 해요. 하지만 이는 운영 서버의 예측 불가능성을 높이는 위험한 습관입니다. 도커 엔진이 업데이트되면서 특정 버전의 컴포즈 문법을 더 이상 지원하지 않거나, 반대로 새로운 기능을 쓰기 위해 반드시 상위 버전이 필요한 상황이 빈번하게 발생하기 때문이에요.

이 글을 끝까지 읽고 나면 다음과 같은 능력을 갖추게 됩니다.

  • 운영 환경에 최적화된 컴포즈 파일 버전 선택 기준 수립
  • 서비스 의존성을 고려한 체계적인 파일 구조 설계
  • 실제 운영 서버에 즉시 적용 가능한 단계별 구축 프로세스
  • 트러블슈팅 능력을 키워주는 실무 실수 사례 분석

단순한 이론이 아니라, 지금 당장 서버 터미널을 열어 적용할 수 있는 실전 지식만을 담았습니다. 안정적인 컨테이너 운영을 위한 첫걸음을 지금 시작해봐요.

구축 전 반드시 챙겨야 할 준비 사항과 판단 기준

본격적으로 파일을 작성하기 전에 현재 사용 중인 서버의 상태를 점검해야 합니다. 무턱대고 최신 문법을 가져다 썼다가는 기존에 돌아가던 서비스가 멈출 수 있어요. 현재 설치된 Docker와 Docker Compose의 버전을 확인하는 것이 가장 우선적인 과제입니다.

터미널에서 docker compose version 명령어를 입력해 보세요. 출력되는 버전에 따라 사용할 수 있는 파일 스키마의 범위가 결정됩니다. 최근에는 Docker CLI에 통합된 Compose V2를 주로 사용하지만, 여전히 구형 서버에는 V1 방식이 남아 있을 수 있으니 주의가 필요해요.

버전 선택은 단순히 ‘최신이 좋다’는 논리로 결정해서는 안 됩니다. 아래 표를 통해 상황에 맞는 기준을 확인해보세요.

선택 기준 권장 버전 주요 특징 적합한 상황
레거시 유지 2.x 버전 단순 서비스, 낮은 리소스 오래된 OS를 사용하는 환경
표준 운영 3.x 버전 Swarm 모드 지원, 확장성 대부분의 중소규모 서비스
최신 기능 활용 V2 통합 버전 CLI 통합, 빠른 속도 신규 프로젝트 구축 시

버전을 결정했다면 그다음은 환경 변수(.env) 관리 전략을 세워야 합니다. 하드코딩된 설정은 보안 사고의 주범이에요. DB 비밀번호나 API 키를 파일에 직접 적지 않고, 어떻게 외부에서 주입할지 미리 설계해두는 것이 좋습니다.

💡 알아두기
최신 Docker Compose V2에서는 파일 상단의 version 필드가 필수가 아니게 변경되었습니다. 하지만 명시적으로 버전을 작성하는 습관은 협업과 문서화 측면에서 여전히 매우 권장되는 방식이에요.

마지막으로 체크리스트를 확인하세요. 사용할 이미지의 태그가 latest로 되어 있지는 않은지, 볼륨 경로는 상대 경로로 관리할 것인지, 네트워크 분리는 어떻게 할 것인지에 대한 답변이 준비되어야 합니다. 준비가 되었다면 이제 실전 구축 단계로 넘어갈 차례입니다.

컴포즈 파일 버전 실전 구축 단계별 실행 가이드

이제 실제 운영 환경에 적용할 수 있는 컴포즈 파일 버전 실전 구축 과정을 진행해볼게요. 단순히 파일을 만드는 것을 넘어, 유지보수가 쉬운 구조를 만드는 것이 핵심입니다.

STEP 1. 디렉터리와 파일 구조 설계하기

파일 하나에 모든 설정을 때려 넣는 것은 운영 단계에서 재앙을 불러옵니다. 서비스가 커질수록 어떤 설정이 어디에 있는지 찾기 힘들어지기 때문이죠. 다음과 같은 구조로 디렉터리를 설계하는 것을 추천해요.

  • project-root/: 프로젝트 최상위 폴더
  • .env: 모든 환경 변수를 관리하는 비밀 파일
  • docker-compose.yml: 전체 서비스 정의 파일
  • nginx/: 웹 서버 설정 파일 및 관련 컨테이너 설정
  • db/: 데이터베이스 초기화 스크립트 및 볼륨 데이터

이렇게 구조를 나누면 나중에 특정 서비스의 설정만 바꿀 때 해당 폴더만 건드리면 되므로 실수를 크게 줄일 수 있습니다. 특히 .env 파일은 절대 Git에 올리지 않도록 .gitignore에 등록하는 것을 잊지 마세요.

STEP 2. 서비스 정의와 의존관계 구성하기

컴포즈 파일의 핵심은 서비스 간의 유기적인 연결입니다. 웹 서버가 실행될 때 데이터베이스가 준비되어 있지 않으면 에러를 내뿜으며 죽어버릴 수 있죠. 이때 사용하는 것이 depends_on 옵션입니다.

하지만 주의할 점이 있어요. depends_on은 컨테이너가 ‘실행’되는 순서만 보장할 뿐, 데이터베이스 내부의 프로세스가 완전히 ‘준비’되었는지는 알지 못합니다. 이를 해결하기 위해 healthcheck 기능을 함께 사용하는 것이 훨씬 안정적입니다. 서비스가 완전히 준비되었을 때 다음 서비스가 동작하도록 정교하게 설계해야 합니다.

STEP 3. 환경 변수와 버전 명시하기

파일 최상단에 버전을 명시하여 이 파일이 어떤 문법 체계를 따르는지 선언하세요. 예를 들어 version: '3.8'과 같이 작성합니다. 이는 나중에 다른 개발자가 파일을 보거나, 자동화 도구가 이 파일을 해석할 때 명확한 기준이 됩니다.

또한, 이미지 태그를 사용할 때는 반드시 구체적인 버전을 적으세요. image: mysql:latest라고 적는 순간, 당신의 서버는 언제 터질지 모르는 시한폭탄을 안게 됩니다. image: mysql:8.0.33처럼 특정 버전을 명시해야만 환경이 바뀌어도 동일한 동작을 기대할 수 있습니다.

STEP 4. 실행 및 초기 설정 최적화

설정이 끝났다면 실행 명령어를 통해 검증합니다. 처음부터 docker compose up -d를 입력하기보다는, docker compose config 명령어를 먼저 사용해보세요. 이 명령어는 작성한 파일의 문법이 올바른지, 환경 변수가 제대로 주입되었는지 미리 검사해줍니다.

⚠️ 주의
운영 서버에서 처음 실행할 때는 반드시 로그를 실시간으로 확인하세요. docker compose logs -f 명령어를 통해 서비스들이 서로 충돌 없이 정상적으로 올라오는지 지켜봐야 합니다.

네트워크 설정도 중요합니다. 모든 서비스가 하나의 네트워크에 있으면 보안상 취약할 수 있어요. 웹 서버용 네트워크와 데이터베이스용 네트워크를 분리하여, 외부에서 직접 DB에 접근하는 경로를 원천 차단하는 설계가 필요합니다.

STEP 5. 운영 환경 전환을 위한 최종 점검

마지막으로 서비스의 생존 전략을 세워야 합니다. 서버가 재부팅되었을 때 컨테이너가 자동으로 살아나야 하므로 restart: always 또는 unless-stopped 옵션을 적절히 설정하세요. 또한, 데이터 유실을 방지하기 위해 볼륨(Volumes) 설정이 호스트의 물리 경로와 정확히 매핑되었는지 다시 한번 확인해야 합니다.

[실전 적용 예시 시나리오]

웹 애플리케이션(Node.js)과 데이터베이스(PostgreSQL)를 연동하는 간단한 구성 예시입니다.

version: '3.8'
services:
db:
image: postgres:15-alpine
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
app:
build: .
depends_on:
db:
condition: service_healthy
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://user:${DB_PASSWORD}@db:5432/mydb
networks:
default:
driver: bridge
volumes:
db_data:

위 예시처럼 healthcheckcondition: service_healthy를 조합하면, DB가 완전히 준비된 후에 앱이 실행되므로 초기 구동 실패를 획기적으로 막을 수 있습니다.

자주 하는 실수와 해결법

자주 하는 실수와 해결법

실전 구축 과정에서 많은 개발자가 반복하는 실수들이 있습니다. 미리 알고 있다면 삽질 시간을 절반 이상 줄일 수 있어요.

  • 이미지 태그를 latest로 설정함
    → 왜 발생하는가: 귀찮아서, 혹은 최신 기능이 바로 적용되길 바라서
    ✅ 해결법: mysql:8.0처럼 특정 마이너 버전까지 명시하여 환경 일관성을 유지하세요.
  • 환경 변수를 컴포즈 파일에 직접 입력함
    → 왜 발생하는가: 설정이 직관적이고 빠르기 때문에
    ✅ 해결법: 반드시 .env 파일을 별도로 생성하고 ${VARIABLE} 문법으로 참조하세요.
  • 볼륨 경로를 절대 경로로 하드코딩함
    → 왜 발생하는가: 경로를 찾기 쉽기 때문
    ✅ 해결법: ./data:/var/lib/mysql처럼 상대 경로를 사용해야 서버 이전 시에도 설정 변경이 적습니다.
  • 의존성 관계를 depends_on만으로 해결하려 함
    → 왜 발생하는가: 단순한 실행 순서만 생각하기 때문
    ✅ 해결법: healthcheck와 연동하여 서비스의 '준비 상태'까지 확인하도록 구성하세요.
  • 네트워크를 하나로 통일함
    → 왜 발생하는가: 설정이 가장 단순하기 때문
    ✅ 해결법: 웹/앱용 네트워크와 데이터베이스용 네트워크를 분리하여 보안 계층을 만드세요.

자주 묻는 질문

Q. 컴포즈 파일 상단의 version 숫자를 안 적으면 어떻게 되나요?

최신 버전의 도커 엔진에서는 생략해도 기본적으로 작동하지만, 명시적으로 적어주는 것이 좋습니다. 버전을 적지 않으면 도커가 임의로 최신 스키마를 적용하게 되는데, 이는 나중에 특정 버전의 문법이 지원 중단될 때 예상치 못한 오류를 일으킬 수 있습니다.

Q. 여러 개의 컴포즈 파일을 동시에 사용할 수 있나요?

네, 가능합니다. docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d와 같이 명령어를 통해 여러 파일을 겹쳐서(Override) 사용할 수 있습니다. 이를 통해 개발용과 운영용 설정을 분리하면 매우 효율적입니다.

Q. 컨테이너가 계속 재시작되는데 어디를 먼저 봐야 할까요?

가장 먼저 docker compose logs [서비스명] 명령어로 에러 로그를 확인하세요. 대부분의 문제는 환경 변수 누락이나 데이터베이스 연결 설정 오류에서 발생합니다.

Q. .env 파일은 어떻게 보안을 유지하나요?
.env 파일은 절대 Git 저장소에 포함되지 않아야 합니다. 서버 환경에서는 직접 파일을 생성하거나, CI/CD 도구의 Secret 기능을 통해 주입하는 방식이 가장 안전합니다.

Q. V1(python 기반)과 V2(Go 기반)의 차이가 큰가요?
기본적인 문법은 유사하지만, V2는 속도가 훨씬 빠르고 도커 명령어로 통합되어 있어 사용이 훨씬 편리합니다. 가능하면 최신 V2 환경으로 구축하세요.

안정적인 운영을 위한 마무리 습관

컴포즈 파일 구축은 한 번으로 끝나는 작업이 아닙니다. 서비스가 성장함에 따라 설정은 계속 변하기 마련이죠. 지속 가능한 운영을 위해서는 구축 직후에 반드시 다음의 루틴을 만들어두어야 합니다.

✅ 핵심 요약

  • 파일 상단에 명확한 버전(예: version: '3.8')을 명시하세요.
  • 이미지 태그는 반드시 특정 버전을 지정하여 사용하세요.
  • 민감한 정보는 .env 파일을 통해 환경 변수로 주입하세요.
  • 서비스 간 의존성은 healthcheck를 포함하여 정교하게 설계하세요.
  • 상대 경로를 사용하여 서버 이전 시 유연성을 확보하세요.
  • 설정 변경 후에는 반드시 docker compose config로 검증하세요.

오늘 배운 내용을 바탕으로 당장 실행해야 할 단계는 다음과 같습니다.

  • 오늘 할 일: 현재 운영 중인 서버의 도커 컴포즈 파일에 version이 명시되어 있는지 확인하기
  • 이번 주 할 일: 모든 이미지 태그를 latest에서 특정 버전으로 변경하기
  • 실행 직전 할 일: 환경 변수 관리를 위해 .env 파일을 분리하고 .gitignore 설정 확인하기

구축 절차를 문서로 남겨 두면 다음 서버 이전이 훨씬 쉬워집니다. 이 가이드가 여러분의 소중한 서비스를 지키는 든든한 방패가 되길 바랍니다.

더 깊이 있는 컨테이너 운영 기술이 궁금하다면, 도커 컴포즈 기본 개념 완벽 정리 — 개념부터 실무 활용까지 한눈에 보는 가이드를 함께 읽어보세요.

댓글 남기기