Kamal 및 Ruby 2.2.2 환경에서 Docker 호환성 문제 해결

Solving Docker Compatibility Issues with Kamal -- Planet Argon Blog

작성자
발행일
2025년 07월 16일

핵심 요약

  • 1 Ruby 2.2.2 레거시 앱을 Kamal로 배포 시 Docker 이미지 스키마 호환성 문제에 직면했습니다.
  • 2 Kamal 빌드 드라이버 변경 및 Docker 버전 다운그레이드로 Schema 1 이미지 문제를 해결했습니다.
  • 3 맞춤형 SSL 인증서는 Kamal 프록시 비활성화 후 Nginx를 통해 설정하여 성공적으로 배포했습니다.

도입

이 글은 Kamal을 사용하여 Ruby 2.2.2 레거시 애플리케이션을 배포하는 과정에서 직면한 Docker 호환성 문제와 SSL 인증서 관련 어려움을 상세히 다룹니다. 현대적인 배포 도구인 Kamal의 단순성과 속도라는 이점에도 불구하고, 오래된 Ruby 애플리케이션의 특성상 예상치 못한 복잡성이 발생했음을 설명합니다. 본 문서는 이러한 기술적 난관을 해결하기 위한 심층적인 분석과 시도들을 제시하며, 레거시 시스템을 최신 컨테이너 환경에 통합할 때 발생할 수 있는 과제와 해결 방안에 대한 귀중한 통찰력을 제공합니다.

클라이언트의 Ruby 2.2.2 애플리케이션을 Kamal로 배포하는 과정에서 가장 먼저 발생한 문제는 Docker 이미지 풀링 오류였습니다. ERROR: failed to solve: failed to load cache key: Pulling Schema 1 images have been deprecated and disabled by default since containerd v2.0 메시지는 ruby:2.2.2-slim 이미지가 Docker Image Manifest Schema 1을 사용하며, 최신 Docker 버전(v26 이상에서 기본 비활성화, v28 이상에서 완전 제거)에서 지원되지 않기 때문에 발생했습니다. 이 문제는 레거시 앱을 현대적인 컨테이너 환경에 통합하려는 시도에서 흔히 발생하는 버전 호환성 문제를 명확히 보여주었습니다.

문제 해결을 위해 세 가지 접근 방식을 시도했습니다. 첫 번째 시도는 Docker 데몬에 DOCKER_ENABLE_DEPRECATED_PULL_SCHEMA_1_IMAGE=1 환경 변수를 설정하여 레거시 스키마 지원을 활성화하는 것이었습니다. 그러나 Kamal의 기본 docker-container 빌드 드라이버가 독립적인 BuildKit 환경에서 작동하며 호스트 Docker 데몬 설정을 상속받지 않기 때문에 이 방법은 효과가 없었습니다. 이는 Kamal의 빌드 전략에 대한 중요한 학습 포인트였습니다.

두 번째 시도는 Kamal의 빌드 드라이버를 docker로 변경하는 것이었습니다. kamal.yml 파일에 builder: driver: docker를 추가함으로써 Kamal이 호스트 Docker 엔진을 직접 사용하도록 하여 호스트 설정이 적용될 수 있게 했습니다. 이는 문제 해결에 진전을 보였지만, 여전히 동일한 오류가 발생했습니다. 그 이유는 호스트 머신이 Docker v28을 실행하고 있었고, 이 버전에서는 Schema 1 지원이 완전히 제거되었기 때문이었습니다. 따라서 세 번째이자 최종 해결책은 Docker 버전을 v26으로 다운그레이드하여 Schema 1을 활성화할 수 있는 환경을 조성하는 것이었습니다. Docker 서비스 재시작 후, 비로소 레거시 Ruby 애플리케이션의 이미지가 성공적으로 빌드되고 배포될 수 있었습니다.

주요 배포 문제를 해결한 후, SSL 인증서 관리라는 또 다른 문제가 발생했습니다. Kamal은 Let’s Encrypt를 통한 내장 프록시를 지원하지만, 클라이언트는 이미 구매한 맞춤형 SSL 인증서를 사용해야 했습니다. Kamal은 기본적으로 타사 인증서를 지원하지 않으므로, Kamal의 프록시를 비활성화하고 Nginx를 액세서리 서비스로 추가하는 방식으로 해결했습니다. Nginx 컨테이너 내에서 기존 인증서 경로를 수동으로 구성하여 클라이언트의 기존 SSL 인프라를 유지하면서 컨테이너화된 배포를 가능하게 했습니다.

결론

이번 Kamal을 이용한 Ruby 2.2.2 레거시 애플리케이션 배포 경험은 현대적인 도구와 오래된 시스템 간의 상호작용에서 발생하는 중요한 교훈들을 제공했습니다. 핵심적으로, Kamal의 빌드 드라이버 선택의 중요성, Docker 버전과 이미지 스키마 간의 호환성 사전 확인의 필요성, 그리고 맞춤형 SSL 설정과 같은 특정 요구사항에 대한 유연한 접근 방식의 중요성을 깨달았습니다. 또한, 현대 도구가 항상 과거 시스템에 역호환되지 않을 수 있다는 점과, 문서화되지 않은 영역에 대한 깊이 있는 탐색 및 발견 공유가 문제 해결에 필수적임을 확인했습니다. 궁극적으로, 적절한 기술적 이해와 문제 해결을 위한 끈기를 통해 Ruby 2.2.2와 같이 오래된 시스템도 현대적이고 안전하며 컨테이너화된 방식으로 성공적으로 배포할 수 있음을 증명했습니다. 이는 레거시 애플리케이션 배포가 단순히 오래된 코드를 유지하는 것을 넘어, 현재의 기술 스택과 과거의 표준이 어떻게 상호작용하는지를 이해하는 데 있음을 시사합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!