Dùng docker để build môi trường cho ứng dụng rails(mysql, redis, sidekiq)

Bài viết này sẽ hướng dẫn sử dụng Docker Compose để cài đặt và chạy một ứng dụng rails / mysql / redis/ sidekiq. (nếu ta chưa install Docker và Docker Compose thì tham khảo tại đây )

Tạo Dockerfile Dockerfile cho ruby 2.3.1 được định nghĩa như sau:

FROM ruby:2.3.1
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN mkdir /my_app
WORKDIR /my_app
ADD Gemfile /my_app/Gemfile
ADD Gemfile.lock /my_app/Gemfile.lock
RUN bundle install
ADD . /my_app

Tạo Gemfile

source 'https://rubygems.org'
gem 'rails', '5.0.0.1'

Tạo Gemfile.lock

File Gemfile.lock để trống.

Cuối cùng là tạo file docker-compose.yml. Đây là file quan trọng nhất, chứa đựng toàn bộ môi trường của application. Miêu tả các services cần cho app (1 database và 1 web app). Ở đây là db và web. Cách thức để các images của các services hoạt động với nhau (database thì chạy từ 1 image của mysql còn web app thì chạy từ thư mục hiện tại bằng build). Các config cần thiết Port của web app

version: '2'
services:
  db:
    image: mysql
    ports:
      - "3307:3307"
    environment:
      MYSQL_ROOT_PASSWORD: 123123
      MYSQL_USER: root
      MYSQL_PASSWORD: 123123
      MYSQL_DATABASE: 123123
  redis:
    image: redis
    environment:
      - REDIS_URL=redis://redis:6379
  sidekiq:
    build: .
    volumes:
      - .:/my_app
    links:
      - db
      - redis
    command: bundle exec sidekiq
    environment:
      - REDIS_URL=redis://redis:6379

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/my_app
    ports:
      - "3000:3000"
    depends_on:
      - db

Build the project

 bundle
 rails  new . --force --database=mysql --skip-bundle

Tạo images

docker-compose build

ta sẽ có được các images Connect the database

Edit file config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: 123123
  host: db

development:
  <<: *default
  database: my_app

Boot the app Quá trình config và build. Giờ ta sẽ khởi động các containers lên để xem kết quả :

docker-compose up

nếu không có lỗi gì xảy ra chúng ta sẽ thu được kết quả bất ngờ 😄

Cuối cùng bạn cần tạo database

docker-compose run web rails db:create

Ứng dụng web gờ sẽ được chạy trên Docker deamon của bạn. (http://localhost:3000/)