본문으로 건너뛰기

Ruby on Whales: Docker를 이용한 효율적인 Ruby on Rails 개발 환경 구축 가이드

Ruby on Whales: Dockerizing Ruby and Rails development—Martian Chronicles, Evil Martians’ team blog

작성자
Ruby on Rails 소식지
발행일
2026년 02월 23일
https://evilmartians.com/chronicles/ruby-on-whales-docker-for-ruby-rails-development

핵심 요약

  • 1 Docker, Compose, Dip을 결합하여 재현 가능하고 일관된 Ruby on Rails 로컬 개발 환경을 구축하는 'Ruby on Whales' 전략을 제시함.
  • 2 Docker Compose의 복잡한 명령어를 래핑하는 Dip 도구를 활용하여 개발자 경험(DX)을 개선하고 대화형 프로비저닝을 지원함.
  • 3 최신 개발 트렌드를 반영하여 Claude CLI와 같은 AI 도구를 컨테이너 내부에 격리하고 Ruby LSP를 연동하는 구체적인 설정을 포함함.

도입

소프트웨어 개발 과정에서 발생하는 '내 컴퓨터에서는 잘 작동한다'는 문제를 해결하기 위해 재현 가능한 개발 환경 구축은 필수적입니다. Evil Martians 팀은 다년간의 경험을 바탕으로 Docker와 Dip을 활용한 최적의 Rails 개발 환경인 'Ruby on Whales'를 제안합니다. 이 방식은 인프라 설정의 복잡함을 숨기면서도 개발자가 선호하는 터미널과 에디터를 자유롭게 사용할 수 있는 유연성을 제공하며, 특히 현대적인 LLM 에이전트 활용 환경까지 고려한 진화된 워크플로우를 지향합니다.

1. Ruby on Whales의 핵심 구성 요소

재현 가능한 개발 환경을 구축하기 위해 ‘Ruby on Whales’는 세 가지 주요 도구를 조합합니다. 첫째, Dockerfile은 애플리케이션의 런타임 환경을 정의합니다. 둘째, Docker Compose (compose.yml)는 데이터베이스(PostgreSQL), 캐시(Redis), 백그라운드 작업(Sidekiq) 등 인프라 서비스 간의 관계를 관리합니다. 셋째, Dip (dip.yml)은 Docker Compose의 복잡한 명령어를 개발자 친화적인 인터페이스로 래핑하여 매일 사용하는 개발 도구처럼 느껴지게 만듭니다.

2. 최적화된 Dockerfile 전략

효율적인 빌드와 이미지 크기 최적화를 위해 다음과 같은 전략을 사용합니다. * Slim 이미지 및 캐싱: ruby-slim 이미지를 기반으로 하되, BuildKit의 --mount=type=cache 기능을 활용하여 apt 패키지 설치 속도를 비약적으로 향상시킵니다. * Aptfile 활용: 프로젝트별 시스템 의존성을 Dockerfile에 하드코딩하지 않고 Aptfile이라는 별도 파일로 분리하여 관리함으로써 범용성을 높입니다. * 환경 변수 최적화: LANG=C.UTF-8 설정을 통해 문자 인코딩 문제를 방지하고, BUNDLE_JOBS 등을 설정하여 패키지 설치 성능을 최적화합니다.

3. Docker Compose 및 성능 고려 사항

로컬 개발 시 발생할 수 있는 성능 저하와 불편함을 해결하기 위한 설정이 포함되어 있습니다. * 볼륨(Volumes) 관리: bundle, node_modules, rails_cache 등을 명명된 볼륨으로 설정하여 호스트 파일 시스템과의 입출력 부하를 줄이고 성능을 극대화합니다. * tmpfs 활용: 서버 실행 시 생성되는 server.pid 파일을 tmpfs에 저장하여 컨테이너가 비정상 종료되었을 때 발생하는 ‘서버 이미 실행 중’ 오류를 원천 차단합니다. * Healthcheck 도입: 데이터베이스가 완전히 준비된 상태에서만 애플리케이션 서비스가 시작되도록 depends_onhealthcheck를 연동합니다.

4. Dip을 통한 개발자 경험(DX) 혁신

Dip은 인프라 중심의 Docker 흐름을 개발 중심의 흐름으로 전환합니다. * 직관적인 명령어: docker compose run --rm web bundle exec rails s 대신 dip rails s와 같은 짧은 명령어를 사용할 수 있게 합니다. * 대화형 프로비저닝: dip provision 명령어를 통해 데이터베이스 생성, 마이그레이션, 의존성 설치 등 복잡한 초기 설정을 자동화하며, 필요한 경우 사용자 입력을 받는 인터랙티브 스크립트를 지원합니다. * 네트워크 통합: 여러 독립적인 프로젝트를 로컬에서 연동해야 할 경우 Docker의 외부 네트워크(external networks) 기능을 Dip 설정 내에서 손쉽게 처리할 수 있습니다.

5. 현대적 도구 통합: AI 및 LSP

최신 개발 트렌드에 맞춰 AI 도구와 언어 서버(LSP)를 통합하는 방법도 다룹니다. * AI 격리: Claude CLI와 같은 AI 도구를 컨테이너 내부에서 실행하여 호스트 시스템에 대한 무분별한 접근을 차단하고 보안을 강화합니다. * LSP 연동: 컨테이너 내부에서 ruby-lsp를 실행하고 호스트의 에디터(VS Code, Zed 등)와 통신할 수 있도록 프록시 스크립트를 설정하여, 컨테이너 환경에서도 강력한 코드 인텔리전스 기능을 유지합니다.

결론

Ruby on Whales 설정은 단순한 컨테이너화를 넘어, 개발 생산성과 보안(AI 격리), 그리고 팀 협업의 효율성을 극대화하는 성숙한 개발 워크플로우를 제공합니다. Docker의 강력한 격리 기능과 Dip의 사용자 친화적인 인터페이스를 결합함으로써, 복잡한 Rails 애플리케이션도 단 한 줄의 명령어로 즉시 개발을 시작할 수 있는 환경을 구축할 수 있습니다. 이는 개발자가 인프라 설정에 낭비하는 시간을 줄이고 실제 비즈니스 로직 구현에 집중할 수 있게 돕는 강력한 도구가 됩니다.

댓글0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

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