07/09/2018, 18:05

Xây dựng hệ thống Single Page Application với Rails API, ReactJS, Docker phần 1

Mình sẽ làm một vài các bài viết để từng bước từng bước 1 xây dựng 1 hệ thống SPA với Rails, React và Docker. Rất mong sẽ giúp ích được điều gì đấy cho các bạn :D Danh sách bài viết bao gồm: Phần 1 mình sẽ tìm hiểu về Docker để cài đặt môi trường phát triển Phần 2 những kiến thức về Rails ...

Mình sẽ làm một vài các bài viết để từng bước từng bước 1 xây dựng 1 hệ thống SPA với Rails, React và Docker.
Rất mong sẽ giúp ích được điều gì đấy cho các bạn :D

Danh sách bài viết bao gồm:

  • Phần 1 mình sẽ tìm hiểu về Docker để cài đặt môi trường phát triển
  • Phần 2 những kiến thức về Rails và React cơ bản để làm hệ thống SPA
  • Phần 3 xác định bài toán, phân tích yêu cầu và let 's code :D

Ở phần đầu tiên này chúng ta sẽ học cách xử dụng Docker để cài đặt môi trường phát triển.

Docker là một công cụ rất hữu ích mà mình rất muốn master nó.
Nó giúp mình có thể cài đặt môi trường phát triển để dễ dàng chia sẻ cho những lập trình viên khác khi tham gia vào dự án. Nó giúp công việc của Devops trở lên dễ dàng hơn, giúp dễ dàng deploy sản phẩm trên nhiều môi trường: development, stagging, qa, production ..., và deploy sản phẩm trên nhiều server

Vậy mình bắt đầu tìm hiểu về Docker thôi!
Mình sẽ cài đặt môi trường phát triển cho 1 ứng dụng Rails đơn giản

gem install rails bundler
rails new demo
cd demo
bundle install

Như vậy chúng ta đã khởi tạo 1 ứng dụng Rails sử dụng database mặc định sqlite3. Chúng ta chạy test và chạy server trên môi trường development

bundle exec rake test
bundle exec rails server

Khi mở localhost:3000 trên browser mình sẽ thấy ứng dụng Rails đầu tiên. Giờ chúng ta sẽ bắt đầu cài đặt ứng dụng này với Docker

Bước 1: Cài đặt Docker cho thiết bị

Nếu bạn đã có Docker trên máy bạn có thể bỏ qua bước này để đến với bước 2. Nếu không bạn sẽ bắt đầu cài đặt Docker trên thiết bị của bạn.
Docker chỉ hỗ trợ chạy trực tiếp trên một số phiên bản của linux. Nếu bạn sử dụng hệ điều hành Ubuntu thì việc cài đặt này rất đơn giản, bạn chỉ cần download về máy từ https://www.docker.com/ và chạy file .deb.
Còn nếu sử dụng Mac và Window thì bạn cũng chỉ cần cài thêm Virtualbox(https://www.virtualbox.org/) và Docker toolbox là xong.

Bước 2: Bắt đầu docker nó

Đầu tiên tạo file Dockerfile trong project Rails mà chúng ta vừa tạo. Bắt đầu từ base image là Ubuntu16.04, ở đây mình dùng một một image đã cài đặt sẵn Ruby: ruby:2.2

FROM ruby:2.4.2
MAINTAINER [email protected]

# Install apt based dependencies required to run Rails as 
# well as RubyGems. As the Ruby image itself is based on a 
# Debian image, we use apt-get to install those.
RUN apt-get update && apt-get install -y  
  build-essential  
  nodejs

# Configure the main working directory. This is the base 
# directory used in any further RUN, COPY, and ENTRYPOINT 
# commands.
RUN mkdir -p /app 
WORKDIR /app

# Copy the Gemfile as well as the Gemfile.lock and install 
# the RubyGems. This is a separate step so the dependencies 
# will be cached unless changes to one of those two files 
# are made.
COPY Gemfile Gemfile.lock ./ 
RUN gem install bundler && bundle install --jobs 20 --retry 5

# Copy the main application.
COPY . ./

# Expose port 3000 to the Docker host, so we can access it 
# from the outside.
EXPOSE 3000

# The main command to run when the container starts. Also 
# tell the Rails dev server to bind to all interfaces by 
# default.
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]

Sau khi thêm file Dockerfile rồi thì chúng ta sẽ build container này. Sử dụng option -t để gán container đó với một tag để có thể gọi nó ở lần sau.

docker build -t demo .
docker run -it --rm bundle exec rake test
docker run -itP demo

Muốn kiểm tra container nào đang chạy thì mình sẽ dùng docker ps

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                     NAMES
eb018d2ca6e2        demo           "bundle exec 'rails    10 seconds ago   

Docker Volumes

Docker cung cấp Volumes dùng để mount bộ nhớ từ các docker container và native host, giúp có thể truy cập để các file mà không cần build image mới khi có sự thay đổi.
Đơn giản chỉ cần gọi docker run

docker run -itP -v $(pwd):/app demo

Improvements

Docker cung cấp .dockerignore tương tự như file .gitignore, giúp chọn ra những file không cần thiết, không lưu chúng vào container. Đây là cách tốt nhất giúp giảm số lần build container
Đơn giản thêm file .dockerignore vào trong folder của project

.git*
db/*.sqlite3
db/*.sqlite3-journal
log/*
tmp/*
Dockerfile
README.rdoc

Entrypoint

Bởi vì chủ yếu các câu lệnh rails đều bắt đầu với bundle exec nên chúng ta có thể định nghĩa [ENTRYPOINT] cho tất cả các câu lệnh

# Configure an entry point, so we don't need to specify 
# "bundle exec" for each of our commands.
ENTRYPOINT ["bundle", "exec"]

# The main command to run when the container starts. Also 
# tell the Rails dev server to bind to all interfaces by 
# default.
CMD ["rails", "server", "-b", "0.0.0.0"]

Nếu không dùng bundle exec thì mình sẽ overide nó đi

docker run -it demo "rake test"
docker run -it --entrypoint="" demo "ls -la"


Locales

Nếu không hài lòng với default locales của docker container. Ta có thể dễ dàng config nó

# Install apt based dependencies required to run Rails as 
# well as RubyGems. As the Ruby image itself is based on a 
# Debian image, we use apt-get to install those.
RUN apt-get update && apt-get install -y  
  build-essential  
  locales  
  nodejs

# Use en_US.UTF-8 as our locale
RUN locale-gen en_US.UTF-8 
ENV LANG en_US.UTF-8 
ENV LANGUAGE en_US:en 
ENV LC_ALL en_US.UTF-8

Moving your Development Environment to PostgreSQL

Rõ ràng trên môi trường production mình không thể dùng sqlite3, chúng ta hãy chuyển nó sang Postgresql.
Thêm file docker-compose.yml

app:
  build: .
  command: rails server -p 3000 -b '0.0.0.0'
  volumes:
    - .:/app
  ports:
    - "3000:3000"

Trên terminal mình cần chạy 2 câu lệnh

docker-compose build
docker-compose up

Thêm vào file docker-compose.yml để bắt đầu sử dùng postgresql

app:
  build: .
  command: rails server -p 3000 -b '0.0.0.0'
  volumes:
    - .:/app
  ports:
    - "3000:3000"
  links:
    - postgres
postgres:
  image: postgres:9.4
  ports:
    - "5432"

Kết luận

Mình vừa sử dụng Docker để chạy một ứng dụng đơn giản với Rails

Bài viết tiếp theo mình sẽ nghiên cứu về Rails API và React js để xây dựng 1 ứng dụng SPA

Chúc các bạn có ngày làm việc hiệu quả và vui vẻ. Happy Coding !

0