
왜 컴포즈 파일 버전 지정이 운영의 성패를 가를까요?
어느 날 퇴근 직전, 갑자기 배포 파이프라인이 멈춰버린 경험이 있으신가요? 분명 로컬 환경에서는 아무 문제 없이 돌아가던 컨테이너들이 운영 서버에만 올라가면 알 수 없는 설정 오류를 뱉어내며 죽어버리곤 해요. 팀장님은 당황해서 로그를 뒤지지만, 정작 문제는 아주 사소한 곳에 숨어 있는 경우가 많습니다.
저희 팀이 겪었던 문제도 바로 그랬어요. 개발 환경에서는 최신 도커 엔진을 사용해서 아무런 제약 없이 컴포즈 파일을 실행했지만, 운영 서버의 환경은 조금 달랐거든요. 컴포즈 파일 버전을 명확히 지정하지 않았던 것이 화근이었어요. 버전 필드가 없거나 모호하면 도커 엔진은 자체적인 기본값으로 파일을 해석하는데, 이 과정에서 네트워크 설정이나 볼륨 마운트 방식이 의도와 다르게 동작할 수 있습니다.
단순히 숫자를 적는 행위라고 생각할 수 있지만, 이 숫자는 컨테이너 생태계의 약속이에요. 어떤 기능을 사용할 수 있는지, 어떤 문법을 허용할지를 결정하는 아주 강력한 규칙이죠. 이번 글에서는 실제 컴포즈 파일 버전 사례를 바탕으로, 우리가 왜 버전을 꼼꼼히 관리해야 하는지, 그리고 실무에서 어떻게 적용해야 시행착오를 줄일 수 있는지 깊이 있게 다뤄보려고 해요.
이 글을 다 읽고 나면 다음과 같은 내용들을 확실히 얻어 가실 수 있어요.
- 실제 서비스 운영 단계에서 버전 지정이 미친 영향
- 규모별 최적의 컴포즈 파일 버전 선택 기준
- 버전 불일치로 발생하는 흔한 에러와 해결법
- 최신 컴포즈 스펙(Specification)으로의 전환 전략
버전 지정을 시작하기 전 확인해야 할 체크리스트
무턱대고 버전을 올린다고 해서 모든 문제가 해결되지는 않아요. 오히려 잘못된 버전 선택은 기존에 잘 돌아가던 서비스에 예기치 못한 장애를 불러올 수 있습니다. 그래서 본격적인 적용에 앞서 우리 팀의 인프라 상태를 먼저 점검하는 과정이 반드시 필요해요.
인프라 환경과 도커 엔진 버전 확인하기
가장 먼저 확인해야 할 것은 현재 운영 중인 서버의 도커 엔진(Docker Engine) 버전이에요. 컴포즈 파일의 특정 버전은 특정 도커 엔진 버전 이상에서만 지원되는 기능들을 포함하고 있거든요. 예를 들어, 버전 3.x 대의 고급 네트워크 기능을 사용하려면 엔진 버전도 그만큼 뒷받침되어야 합니다. 서버의 버전을 모르는 상태에서 컴포즈 파일만 수정하는 것은 눈을 감고 운전하는 것과 같아요.
버전 선택을 위한 판단 기준 비교
어떤 버전을 선택할지 고민될 때는 아래의 기준표를 참고해 보세요. 현재 우리 서비스가 처한 상황에 따라 최적의 선택지가 달라질 수 있습니다.
| 구분 | 주요 특징 | 추천 상황 |
|---|---|---|
| 버전 2.x | 기본적인 컨테이너 연결 및 네트워크 중심 | 매우 가벼운 단일 서버 운영 |
| 버전 3.x | Swarm 모드 및 스케일링 기능 최적화 | 클러스터 환경 및 고가용성 필요 시 |
| Compose Spec | 버전 필드 없이 유연한 문법 사용 | 최신 도커 환경 및 CI/CD 통합 시 |
최근 도커 커뮤니티는 특정 버전을 명시하는 방식에서 벗어나, 모든 기능을 통합한 Compose Specification으로 나아가고 있어요. 하지만 기존 레거시 시스템과의 호환성을 고려한다면 여전히 명시적인 버전 지정이 중요합니다.
준비물 및 사전 점검 사항
설정을 변경하기 전에 팀 내에서 다음 사항들이 합의되었는지 꼭 체크해 보세요.
- 팀 내부의 표준 컴포즈 파일 템플릿이 있는가?
- 운영 서버의 도커 엔진 업데이트 계획이 수립되었는가?
- 설정 변경 시 즉시 롤백할 수 있는 백업본이 준비되었는가?
실무에서 경험한 컴포즈 파일 버전 단계별 적용 시나리오
이론적인 이야기보다는 실제 저희 팀이 겪었던 컴포즈 파일 버전 사례들을 시간 순서대로 들려드릴게요. 소규모 서비스에서 시작해 트래픽이 폭발적으로 늘어나는 과정에서 우리가 어떻게 버전을 관리하며 성장했는지 확인해 보세요.
STEP 1. 초기 스타트업의 소규모 서비스 적용기
저희 팀이 처음 서비스를 런칭했을 때는 아주 단순한 구조였어요. Node.js를 기반으로 한 웹 서버 하나와 PostgreSQL 데이터베이스 하나, 그리고 Redis 캐시 서버까지 딱 세 개의 컨테이너만 띄우면 됐거든요. 이때 저희는 별생각 없이 버전 필드 자체를 생략한 채로 컴포즈 파일을 작성했어요. “어차피 잘 돌아가는데 굳이 적어야 하나?”라는 생각이 지배적이었죠.
하지만 서비스가 조금씩 커지면서 문제가 터졌어요. 신규 개발자가 로컬 환경에서 테스트를 위해 최신 버전의 도커를 설치했는데, 버전 필드가 없는 파일을 실행하자 도커 엔진이 이를 임의의 최신 버전 문법으로 해석해버린 거예요. 이로 인해 개발자의 로컬 환경과 운영 서버의 네트워크 동작 방식이 미세하게 달라졌고, 데이터베이스 연결이 간헐적으로 끊기는 현상이 발생했습니다. 결국 저희는 모든 파일 상단에 version: ‘3.8’을 명시하는 규칙을 만들었어요. 아주 작은 변화였지만, 환경 간의 불일치를 막는 결정적인 방어선이 되었습니다.
STEP 2. 트래픽 급증과 스케일링 대응 시나리오
서비스가 성장하면서 사용자 유입이 급격히 늘어났어요. 이제는 단순히 컨테이너를 띄우는 것을 넘어, 여러 대의 서버에 컨테이너를 분산 배치하고 부하를 조절해야 하는 상황이 왔습니다. 저희는 이 시점에서 컴포즈 파일 버전을 3.x 대로 정교하게 다듬어야 했어요.
특히 Docker Swarm 모드를 도입하면서 컴포즈 파일의 역할이 완전히 달라졌습니다. 버전 3.x 대부터 지원되는 deploy 키를 활용해 각 컨테이너의 리소스 제한(CPU, Memory)과 복제본(Replicas) 개수를 설정했거든요. 만약 이때 버전을 2.x 대로 유지했다면, 우리가 원하는 스케일링 설정을 컴포즈 파일에 담을 수조차 없었을 거예요. 트래픽이 몰리는 시간대에 자동으로 컨테이너 수를 늘리는 전략을 세울 수 있었던 것은 정확한 버전 지정 덕분이었습니다.
STEP 3. CI/CD 파이프라인 통합과 자동화 과정
운영 규모가 커지니 사람이 직접 서버에 접속해서 `docker-compose up`을 치는 방식은 너무 위험해 보였어요. 그래서 Jenkins를 활용한 자동 배포 파이프라인을 구축했습니다. 이때 가장 공을 들인 부분이 바로 컴포즈 파일의 검증 단계였어요.
배포 스크립트 단계에서 컴포즈 파일의 버전 문법이 유효한지를 먼저 검사하도록 설계했습니다. 만약 누군가 실수로 잘못된 버전 형식을 작성하거나, 현재 인프라가 지원하지 않는 높은 버전의 기능을 포함했다면 배포 자체가 시작되지 않도록 막은 거죠. 이 과정을 통해 배포 중 발생하는 설정 오류를 90% 이상 사전에 차단할 수 있었습니다. 자동화된 환경일수록 컴포즈 파일 버전은 단순한 설정값이 아니라, 배포의 안전을 담보하는 코드(Infrastructure as Code)로서의 가치를 가집니다.
STEP 4. 버전 불일치로 인한 대형 장애와 복구 경험
물론 모든 과정이 순탄했던 것은 아니에요. 한 번은 운영 서버의 도커 엔진을 보안 패치를 위해 업데이트했는데, 이 과정에서 컴포즈 엔진(Compose Engine)의 해석 방식이 미세하게 바뀌면서 대형 장애가 발생한 적이 있습니다. 기존에 사용하던 버전 3.x의 특정 네트워크 드라이버 옵션이 업데이트된 환경에서 경고를 내뱉으며 작동하지 않았던 것이죠.
당시 저희는
도커 엔진 업데이트는 컴포즈 파일의 해석 방식에 영향을 줄 수 있으므로, 반드시 스테이징 환경에서 충분한 테스트를 거쳐야 합니다.
이 문제를 해결하기 위해 저희는 즉시 이전 버전의 엔진으로 롤백하고, 컴포즈 파일에서 문제가 된 옵션을 최신 규격에 맞게 수정했습니다. 이 사건 이후로 저희 팀은 인프라 구성 변경 시 컴포즈 파일의 호환성 테스트를 가장 중요한 체크리스트로 관리하고 있습니다.
STEP 5. 최신 Compose Specification으로의 전환 준비
현재 저희는 특정 버전을 명시하는 방식에서 벗어나, 최신 표준인 Compose Specification을 받아들일 준비를 하고 있어요. 이제는 `version: ‘3.8’` 같은 문구를 생략해도 도커가 스마트하게 파일을 읽어들이는 시대가 되었거든요. 하지만 갑작스러운 변화는 위험하니까, 저희는 현재 운영 중인 모든 서비스의 컴포즈 파일을 컴포즈 스펙 규격에 맞춰 리팩토링하는 작업을 차근차근 진행하고 있습니다.
실무에서는 한 번에 모든 파일을 바꾸려 하지 마세요. 가장 영향도가 낮고 단순한 서비스부터 하나씩 스펙을 적용하며 검증하는 방식이 가장 안전합니다.
자주 하는 실수와 해결법
실무에서 컴포즈 파일을 다루다 보면 정말 다양한 에러를 마주하게 됩니다. 그중에서도 특히 컴포즈 파일 버전과 관련된, 가장 빈번하게 발생하는 실수들을 정리해 보았어요.
- ❌ 실수: 버전 필드를 아예 작성하지 않음
왜 발생하는가: 초기 설정 시 귀찮음이나 중요성 간과로 인해 발생해요. 이 경우 도커 엔진이 임의의 버전을 가정하므로 환경 간 불일치가 생깁니다.
✅ 해결법: 반드시 파일 상단에 `version: ‘3.8’`과 같이 명시적인 버전을 작성하세요. - ❌ 실수: 엔진 버전보다 높은 컴포즈 버전 사용
왜 발생하는가: 로컬에서는 최신 도커를 쓰는데, 운영 서버는 구버전일 때 발생해요. 배포 시 문법 오류가 발생합니다.
✅ 해결법: 운영 서버의 도커 엔진 버전을 먼저 확인하고, 그 엔진이 지원하는 최대 버전에 맞춰 컴포즈 파일을 작성하세요. - ❌ 실수: 버전 2.x 문법과 3.x 문법의 혼용
왜 발생하는가: 인터넷의 오래된 예제 코드를 복사해서 쓸 때 자주 발생해요. 예를 들어, 3.x에서는 지원하지 않는 `links` 설정을 2.x 방식으로 사용하는 경우입니다.
✅ 해결법: 사용할 버전에 맞는 공식 문서를 항상 옆에 띄워두고, 사용하려는 키(Key)가 해당 버전에 포함되어 있는지 확인하세요. - ❌ 실수: Swarm 모드 전용 키를 일반 Docker로 실행
왜 발생하는가: `deploy` 키를 사용한 파일을 일반 `docker-compose up`으로 실행하면 설정이 무시되거나 경고가 뜹니다.
✅ 해결법: 스케일링이 필요하다면 Swarm 모드를 활성화하거나, 일반 환경에서는 `deploy` 옵션이 동작하지 않음을 인지하고 설정해야 합니다. - ❌ 실수: 버전 변경 후 볼륨/네트워크 설정 누락
왜 발생하는가: 버전을 올리면서 네트워크 드라이버나 볼륨 마운트 방식의 문법이 바뀌는 경우가 있습니다.
✅ 해결법: 버전을 올린 직후에는 반드시 `docker-compose config` 명령어를 통해 설정 파일이 올바르게 해석되는지 검증하세요.
자주 묻는 질문
Q. 컴포즈 파일 버전을 꼭 적어야 하나요? 안 적으면 어떻게 되나요?
결론부터 말씀드리면, 적는 것이 훨씬 안전합니다. 적지 않으면 도커 엔진은 해당 파일을 최신 스펙으로 간주하려고 시도하는데, 이때 엔진 버전에 따라 해석 방식이 달라져 배포 오류나 예기치 못한 동작을 유발할 수 있습니다. 환경의 일관성을 위해 명시하는 습관을 들이세요.
Q. 3.8 버전이 가장 좋은 버전인가요? 무조건 높은 게 좋은가요?
꼭 그렇지는 않아요. 높은 버전일수록 더 많은 기능을 제공하지만, 그만큼 요구하는 도커 엔진의 버전도 높아집니다. 우리 운영 서버의 엔진이 구버전이라면 오히려 낮은 버전을 선택하는 것이 안정적일 수 있습니다. 우리 환경과의 호환성이 최우선입니다.
Q. 최신 Compose Specification을 쓰면 버전 필드를 지워도 되나요?
네, 최신 버전의 도커와 컴포즈를 사용 중이라면 버전을 생략하는 것이 표준 방식입니다. 다만, 기존에 운영하던 시스템이 있다면 한꺼번에 지우지 말고, 단계적으로 테스트를 거치며 전환하는 것을 추천해 드려요.
Q. 버전 2와 3 중 어떤 것을 선택해야 할지 모르겠어요.
단일 서버에서 가벼운 서비스를 운영한다면 2.x도 충분하지만, 요즘은 대부분 3.x 대를 기준으로 삼습니다. 특히 클러스터링이나 확장성을 고려하고 있다면 고민 없이 3.x 이상을 선택하세요.
우리 팀에 최적화된 버전 관리 전략 세우기
지금까지 컴포즈 파일 버전 지정과 관련된 다양한 실무 사례와 주의점을 살펴보았습니다. 결국 핵심은 환경의 일관성을 어떻게 유지하느냐에 달려 있어요. 무분별한 업데이트보다는 우리 팀의 인프라 상황을 정확히 파악하고 그에 맞는 약속을 정하는 것이 중요합니다.
- 운영 서버의 도커 엔진 버전을 반드시 먼저 확인하세요.
- 버전 필드는 명시적으로 작성하여 환경 간 불일치를 방지하세요.
- 규모가 커질수록 3.x 대의 기능을 활용해 확장성을 확보하세요.
- CI/CD 단계에서 컴포즈 파일 문법 검증 과정을 포함하세요.
- 최신 스펙으로의 전환은 작은 서비스부터 단계적으로 진행하세요.
글을 마치며, 오늘 바로 실행해 보실 수 있는 단계를 제안해 드릴게요.
- 오늘 할 일: 현재 운영 중인 서비스의 컴포즈 파일 상단에 버전이 명시되어 있는지 확인하기
- 이번 주 할 일: 팀 내에서 사용하는 도커 엔진 버전과 컴포즈 파일 버전의 호환성 매트릭스 만들기
- 실행 직전 할 일: 설정 변경 시 바로 되돌릴 수 있는 롤백 시나리오 점검하기
비슷한 환경에서 운영의 어려움을 겪고 계신가요? 너무 거창한 시스템을 구축하려 하기보다, 지금 바로 파일 상단에 버전을 적는 것부터 시작해 보세요. 작은 습관이 모여 안정적인 서비스 운영을 만듭니다. 만약 이 과정이 혼자 하기 벅차다면, 작은 파일럿 프로젝트부터 적용하며 팀원들과 경험을 공유해 보시길 권장해요.
관련해서 더 깊이 있는 내용이 궁금하시다면 아래 글을 함께 읽어보세요.
도커 컴포즈 기본 개념 완벽 정리 — 개념부터 실무 활용까지 한눈에 보는 가이드