Rails 8 프로덕션 배포를 위한 Dockerfile 심층 분석

Inside the default Dockerfile | Rails 8 Unpacked

작성자
이원섭
발행일
2024년 12월 14일

핵심 요약

  • 1 Rails 8은 Kamal과 Docker를 활용하여 애플리케이션 배포를 간소화하며, 'Hello World에서 IPO까지'라는 비전을 실현합니다.
  • 2 Docker는 컨테이너, 이미지, Dockerfile의 세 가지 핵심 개념을 통해 애플리케이션과 그 종속성을 호스트 OS와 격리된 환경에서 실행할 수 있도록 지원합니다.
  • 3 Rails 8의 기본 Dockerfile은 멀티 스테이지 빌드 방식을 사용하여 프로덕션에 최적화된 작고 안전한 이미지를 생성하며, Gem 설치, 에셋 컴파일, 데이터베이스 준비 등을 자동화합니다.

도입

Rails 8은 'Hello World에서 IPO까지'라는 슬로건 아래, 개발자가 단독으로 애플리케이션을 구축하고 배포할 수 있도록 혁신적인 변화를 가져왔습니다. 특히 코드 배포 과정을 대폭 간소화하여, Kamal과 Docker라는 두 가지 핵심 기술을 통해 프로덕션 환경으로의 전환을 용이하게 합니다. 본 영상은 Rails 8 애플리케이션 배포의 핵심 요소인 Dockerfile을 심층적으로 분석하여, Rails 8이 어떻게 프로덕션 준비된 컨테이너 이미지를 효율적으로 생성하는지 설명합니다.

Docker의 기본 개념

  • 컨테이너: 호스트 운영 체제 내에서 프로세스 집합을 격리하여 실행하는 제한된 런타임 환경입니다. CH root 및 R limit와 같은 기술을 통해 호스트 시스템의 다른 부분에 영향을 주지 않으면서 리소스를 공유합니다.
  • Docker: 이러한 컨테이너의 생명 주기(생성, 시작, 중지)를 관리하고 Dockerfile을 기반으로 이미지를 빌드하는 도구입니다. 복잡한 격리 설정을 수동으로 처리할 필요 없이 컨테이너 관리를 단순화합니다.
  • Dockerfile: Docker 이미지를 빌드하기 위한 지침이 담긴 텍스트 파일입니다. 이 지침에 따라 이미지에 필요한 파일, 라이브러리, 종속성이 포함됩니다.
  • Docker Image: 애플리케이션을 컨테이너에서 실행하는 데 필요한 모든 것을 포함하는 템플릿입니다. Dockerfile을 통해 생성됩니다.

Rails 8 Dockerfile 분석

Rails 8은 기본적으로 고도로 최적화된 Dockerfile을 제공하여 프로덕션 배포를 지원합니다. 주요 특징은 다음과 같습니다.

  • 기본 이미지 설정 (ARG, FROM): Ruby:3.3.5-slim과 같은 Docker Hub의 경량 Ruby 이미지를 기반으로 시작하여 필요한 패키지를 설치하고 작업 디렉터리를 설정합니다.
  • 환경 변수 설정 (ENV): 빌드 및 런타임에 필요한 환경 변수를 정의합니다.
  • 멀티 스테이지 빌드 (FROM base as build): Rails 8 Dockerfile의 핵심 기능으로, 최종 이미지 크기를 최소화하기 위해 두 단계로 빌드를 진행합니다.
    • 빌드 스테이지: Gemfile 복사, bundle install을 통한 Gem 설치, 애플리케이션 코드 복사, BootSnap 및 에셋(bin/rails assets:precompile, Propshaft 활용) 컴파일 등 빌드에 필요한 모든 작업을 수행합니다.
    • 베이스 스테이지: 빌드 스테이지에서 생성된 필수 아티팩트(Gem, 컴파일된 코드 등)만을 베이스 스테이지로 복사합니다. 이를 통해 빌드 과정에서 사용된 불필요한 도구나 중간 파일들이 최종 이미지에 포함되지 않아 이미지 크기가 대폭 줄어듭니다.
  • 보안 강화: 특정 파일의 소유자를 비-루트 사용자(non-user)로 변경하여 보안을 강화합니다.
  • 엔트리포인트 (ENTRYPOINT): 컨테이너 시작 시 항상 실행될 명령을 정의합니다. Rails 8에서는 bin/rails DB prepare를 실행하여 데이터베이스 스키마를 최신 상태로 유지합니다.
  • 명령어 (CMD): 컨테이너 실행 시 기본적으로 수행될 명령을 지정합니다. Rails 8에서는 Thruster 프록시를 시작한 후 Rails 서버를 구동합니다.

이러한 구조를 통해 개발자는 docker build 명령 하나로 Rails 8 애플리케이션을 프로덕션 환경에 즉시 배포 가능한 최적화된 Docker 이미지로 변환할 수 있습니다.

결론

Rails 8의 Dockerfile은 프로덕션 배포를 위한 강력하고 효율적인 도구입니다. 멀티 스테이지 빌드와 같은 고급 기법을 활용하여 이미지 크기를 최소화하고 보안을 강화하며, 애플리케이션 실행에 필요한 모든 종속성을 효과적으로 관리합니다. 이로써 개발자는 'Hello World'에서 시작하여 'IPO'에 이르는 여정에서 코드 배포의 복잡성을 줄이고, 애플리케이션을 안정적이고 효율적으로 운영할 수 있는 기반을 마련합니다. 다음 단계에서는 Kamal을 통해 이 이미지를 실제 라이브 서버에 배포하는 방법을 다룰 예정입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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