1. 개요

<Docker 가상 환경 구축 입문>의 <Chapter 8-2. Docker Compose를 사용한 Ruby on Rails 개발환경 구축>를 읽고 정리한 내용으로,

Docker Compose를 사용하여 Ruby on Rails 개발 환경을 구축하는 방법에 대해 설명합니다.

 

2. Ruby on Rails 개발 환경 구축 예시

  • 빈 디렉토리를 만들고, 그 안에 Rails를 실행할 이미지를 생성하기 위한 Dockerfile을 작성
    FROM ruby:2.3.7
    RUN apt-get update -qq && apt-get install -y build-essential nodejs
    RUN mkdir /app
    WORKDIR /app
    COPY Gemfile /app/Gemfile
    COPY Gemfile.lock /app/Gemfile.lock
    RUN bundle install
    COPY . /app
    • RUN apt-get update -qq && apt-get install -y build-essential nodejs: Rails 실행에 필요한 패키지 설치
    • RUN bundle install: 사전에 Gemfile에 정의한 gem을 설치
  • gem을 다운로드하기 위한 Gemfile 작성
    source 'https://rubygems.org'
    gem 'rails', '5.0.0.1'
  • gem 버전을 기록하는 Gemfile.lock 생성
    $ touch Gemfile.lock
  • Rails를 실행할 Web 서비스와 MySQL 서버를 정의하는 docker-compose.yml 파일 작성
    version: '3'
    services:
      web:
        build: .
        command: bundle exec rails server -p 3000 -b 0.0.0.0
        ports:
          - "3000:3000"
        volumes:
          - .:/app
        depends_on:
          - db
        tty: true
        stdin_open: true
      db:
        image: mysql:5.7
        volumes:
          - db-volume:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: password 
    volumes:
      db-volume:
    • depends_on: web 서비스가 사용할 서비스가 사전에 기동되어 있어야할 때 정의. 위의 경우 Rails가 사용할 MySQL 서버를 사전에 기동한다는 의미. 
    • environment: 환경변수를 설정. MYSQL_ROOT_PASSWORD는 root 비밀번호 설정을 위한 환경 변수.
  • Web 서비스 이미지 빌드 및 Rails 프로젝트 생성 
    $ docker-compose run web rails new . --force --datatbase=mysql
    $ docker-compose build
    $ docker run --rm rails_web ls -la /app
    
    • rails new . --force --database=mysql: 현재 디렉토리아래에 Rails 프로젝트 파일을 생성하며, database를 MySQL로 지정.
    • 첫번째 커맨드를 실행하면 이미지 빌드 후에 rails new가 실행되었기 때문에 다시 docker-compose build를 실행.
  • Rails에서 사용할 데이터베이스 설정을 위해 config/database.yml 파일 수정
    ...
    default: &default
      adapter: sqlite3
      encoding: utf8
      pool: 5
      username: root
      password: password
      host: db
      timeout: 5000
    ...
  • 서비스를 기동하기 위한 명령어 실행
    $ docker-compose up -d
    $ docker-compose ps
    $ docker-compose run web rake db:create
    • 컨테이너 실행 후에 커맨드를 입력하기 위해서는 -d(Detached) 옵션을 포함해야 함.
  • 참고) 서비스를 중지, 삭제하기 위한 명령어
    $ docker-compose stop
    $ docker-compose down
    • 다시 기동하기 위해서는 docker-compose up -d 명령어를 사용함.
  • 작성한 프로젝트 파일, Docker 설정 파일 등을 배포하면, 간단하게 개발 환경을 구축할 수 있음.