Config Rails app sử dụng Docker từ đầu đến cuối

Tram Ho

Nếu như bạn là một developer đã từng có chân trong nhiều dự án cùng lúc thì chắc hẳn bạn cũng đã từng gặp phải những vấn đề khó chịu liên quan đến phiên bản hay thư viện được sử dụng trong mỗi dự án đó. Để rồi mỗi khi chuyển đổi qua lại giữa các môi trường bạn lại phải mất công setup lại đủ thứ. Hay đơn giản hơn là việc code trên máy công ty thì chạy, nhưng khi về đến nhà, bạn mở máy ra code những đoạn code còn dang dở thì lại không hiểu tại sao nó lại không thể chạy được nữa. Đó cũng chính là lúc bạn sẽ nghĩ đến docker. Với khẩu hiệu “build once, run anywhere“, chắn chắn những vấn đề trên sẽ không còn khiến bạn phải đau đầu thêm nữa. Ngày hôm nay chúng ta sẽ cùng nhau dựng một ứng dụng Ruby on Rails trên môi trường Docker.

Docker compose

Trước khi đi vào vấn đề chính, chúng ta cần phải xác định rõ những container nào sẽ được tạo cũng như phuơng thức giao tiếp giữa chúng.

  • Đầu tiền là container app có nhiệm vụ xử lý logic chính của ứng dụng.
  • Tiếp theo là container db sẽ là nơi lưu trữ dữ liệu.
  • Cuối cùng là container nginx đảm nhận chức năng là web server.

Đó cũng chính là những thành phần cơ bản nhất của một ứng dụng web bất kỳ. Việc xác định những thành phần này cũng hết sức quan trọng, vì nó cho bạn một cái nhìn tổng quan về toàn bộ hệ thống, chức năng của mỗi thành phần để từ đó tối ưu các container cho phù hợp. Dưới đây là nội dung file docker-compose.yml, nó giống như là một tài liệu chỉ dẫn để build image cũng như quan hệ giữa các container với nhau:

Trong file docker-compose.yml, ở mỗi block chúng ta để ý tới những chi tiết sau:

  • build:
    • context: Đây là nơi định nghĩa nơi Dockerfile sẽ được chạy.
    • dockerfile: Chỉ định docker file sẽ được sử dụng để build.
    • args: Các giá trị truyền thêm vào trong Dockerfile
  • depends_on: Định nghĩa ràng buộc giữa các container với nhau, sử dụng thay thế cho links.
  • volumes: Xác định vùng nhớ của máy chủ sẽ được mount vào trong container.
  • env_file: Là vị trí file env, bạn có thể dùng các biến env này ở bất cứ đâu trong filedocker-compose.yml.
  • environment: Là nơi xác định các biến môi trường trong container.
  • command: Đây là file sh sẽ được chạy khi container được start.

Dockerfile

Để thuận tiện cho việc quản lý, chúng ta sẽ tạo ra những thư mục tuơng ứng với từng thành phần, với appnginx các thư mục tương ứng của chúng lần lượt là docker/app, docker/nginx.

Config app

Dưới đây là nội dung docker/app/Dockerfile nơi chúng ta sẽ chỉ định những thành phần tạo nên image app để từ đó build thành container app:

Như đã thấy trong nội dụng file docker-compose.yml, chúng ta sử dụng context . cho image app, điều này có nghĩa là file docker/app/Dockerfile sẽ được chạy giống như là nó đang nằm ở ngoài thư mục root của ứng dụng. Đó là lý do vì sao chúng ta có thể sử dụng các lệnh:

Chúng ta cũng sử dụng một file docker/app/command.sh để chạy các lệnh trước khi khởi động server:

Để ý là trước đó chúng ta đã đưa file này từ bên ngoài vào trong container và set quyền cho nó bằng lệnh:

Config Nginx

Đến bước này chúng ta cũng đã có thể chạy ứng dụng của mình được rồi, tuy nhiên để cho mọi thứ gần mới môi trường deploy hơn thì chúng ta cần có thêm một container khác nữa là ngnix:

Trên đây là nội dung trong file docker/nginx/Dockerfile, nó là các chỉ thị để build những thành phần cần thiết cho container nginx. Tiếp theo chúng ta sẽ chuẩn bị file docker/nginx/nginx.conf để config cho nginx với nội dung sau:

Chúng ta copy file này vào trong thư mục /tmp/ của container bằng lệnh:

Vì Nginx không hỗ trợ chúng ta truyền các biến môi trường vào trong file config, do đó để khắc phục điều này, chúng ta đã sử dụng envsubst để replace nội dung trong file /tmp/nginx.conf trước khi đưa nó vào trong /etc/nginx/nginx.conf:

Build

Chuẩn bị một file .env để lưu tất cả biến môi trường sử dụng trong ứng dụng, nó trông sẽ như thế này:

Mọi thứ có vẻ ổn, giờ là lúc chúng ta tận hưởng thành quả của mình, đầu tiên là build images:

Nếu như tất cả các image đã được build thành công thì tiếp theo bạn hãy chạy lệnh:

Mở trình duyệt lên và đánh vào đường dẫn http://localhost nếu như màn hình hiện lên “Yay! You’re on Rails” thì coi như chúng ta đã thành công.

Summary

Vừa rồi chúng ta đã cùng nhau đi dựng một ứng dụng Rails sử dụng Docker. Trên đây mình sử dụng phiên những phiên bản mới nhất của Rails, Ruby và Docker. Hi vọng bài viết sẽ phần nào hữu ích để bạn có thể tự config Docker cho project của mình.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo