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 이미지로 변환할 수 있습니다.