개발 컨테이너는 종종 VS Code의 특정 기능으로 오해되기도 하지만, 본질적으로는 일반적인 Docker 컨테이너입니다. Dockerfile 또는 docker-compose.yml을 기반으로 하며, 이미 도커화된 애플리케이션의 개발용 이미지 또한 개발 컨테이너로 간주될 수 있습니다. 개발 컨테이너의 진정한 가치는 특정 컨벤션을 따름으로써 에디터 및 IDE와의 통합이 용이해지고, 결과적으로 컨테이너 사용이 매우 편리해지는 지점에서 발휘됩니다. 첫 번째 주요 컨벤션은 .devcontainer
폴더의 사용입니다. 이 폴더는 Dockerfile 및 docker-compose.yml과 같은 컨테이너 관련 구성 파일을 저장하는 표준 위치로, 에디터 확장이 설정을 쉽게 인식하도록 돕습니다. 두 번째는 devcontainer.json
파일입니다. 이 JSON 파일은 애플리케이션의 컨테이너 환경 설정을 기술하며, 컨테이너 이름, Dockerfile 경로, 빌드 컨텍스트, 그리고 postCreateCommand
와 같은 명령을 정의할 수 있습니다. 이 파일은 VS Code와 같은 개발 환경에서 컨테이너를 자동으로 빌드하고 실행하는 데 필수적인 역할을 합니다.
Rails 애플리케이션에 개발 컨테이너를 설정하는 과정은 매우 직관적입니다. 앞서 언급했듯이, .devcontainer
폴더를 생성하고 그 안에 Dockerfile, docker-compose.yml, 그리고 entrypoint.sh 파일을 배치합니다. Rails 애플리케이션은 대부분 데이터베이스를 필요로 하므로, 애플리케이션과 데이터베이스 서비스를 함께 관리하기 위해 docker-compose.yml 파일이 필수적입니다. 또한, gem 번들 설치 및 데이터베이스 설정(생성, 마이그레이션)을 자동화하기 위한 entrypoint.sh 스크립트도 포함됩니다.
- Dockerfile: Ruby 3.3.0 이미지를 기반으로 Node.js, Yarn, build-essential, PostgreSQL 클라이언트 라이브러리(libpq-dev), netcat-traditional 등 필수 패키지를 설치합니다. 이후 Rails와 Bundler를 설치하고, 작업 디렉토리를
/app_name
으로 설정합니다. 마지막으로 entrypoint.sh 스크립트를 컨테이너 내부에 복사하고 실행 권한을 부여하여 컨테이너 시작 시 자동으로 실행되도록 합니다. - entrypoint.sh: 이 셸 스크립트는 컨테이너가 시작될 때
bundle install
을 실행하고, PostgreSQL 데이터베이스가 준비될 때까지 대기합니다. 데이터베이스 연결이 확인되면bundle exec rails db:create
및bundle exec rails db:migrate
명령을 통해 데이터베이스를 설정한 후 대화형 셸을 시작합니다. - docker-compose.yml:
web
서비스(Rails 애플리케이션)와db
서비스(PostgreSQL 데이터베이스)를 정의합니다.web
서비스는 현재 프로젝트 루트 디렉토리를/app_name
으로 마운트하고, gem 캐싱을 위한bundle_cache
볼륨을 사용합니다. 포트 3000을 호스트와 연결하고,db
서비스에 의존성을 가집니다.db
서비스는postgres:13
이미지를 사용하며, PostgreSQL 사용자, 비밀번호, 데이터베이스 이름을 환경 변수로 설정하고,pgdata
볼륨을 통해 데이터 지속성을 확보합니다. - devcontainer.json: 이 파일은 Rails 개발 컨테이너의 설정을 정의합니다.
dockerComposeFile
을docker-compose.yml
로 지정하고, 주 서비스로web
을 설정하며, 작업 공간을/app_name
으로 지정합니다.customizations
섹션에서는 VS Code 확장을 추가할 수 있으며,postCreateCommand
를 통해 컨테이너 생성 후bundle install && rails db:create && rails db:migrate
와 같은 초기 설정을 자동화할 수 있습니다.
이러한 설정이 완료되면, docker compose -f .devcontainer/docker-compose.yml build
명령으로 컨테이너를 빌드하고, docker compose -f .devcontainer/docker-compose.yml run --rm --service-ports web
명령으로 실행할 수 있습니다. VS Code에서 프로젝트 폴더를 열고 Dev Containers 확장이 설치되어 있다면, 에디터가 자동으로 컨테이너 환경을 인식하고 개발을 시작할 수 있도록 지원합니다. 애플리케이션은 localhost:3000
으로 접근 가능하며, 테스트 실행은 docker compose -f .devcontainer/docker-compose.yml run --rm --service-ports web bundle exec rspec
과 같은 명령을 통해 컨테이너 내에서 수행할 수 있습니다.