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 설정 파일 등을 배포하면, 간단하게 개발 환경을 구축할 수 있음.