Tải bản đầy đủ (.pdf) (120 trang)

Đồ án tìm hiểu về docker và ruby on rails (đồ án SE121 l21 PMCL)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (8.12 MB, 120 trang )


Tìm hiểu về Docker và Ruby On Rails

MỤC LỤC

I. GIỚI THIỆU CHUNG
1. Thơng tin nhóm
2. Tổng quan đề tài:
2.1. Giới thiệu đề tài
2.2. Phạm vi nghiên cứu
2.3. Nội dung nghiên cứu
2.4. Kết quả hướng tới:
3. Công cụ sử dụng:

8
8
8
8
9
9
9
10

II. RUBY ON RAILS
1. Khái niệm Ruby on Rails
2. Tại sao lại chọn Ruby on Rails?
3. Kiến trúc Ruby On Rails
3.1. Tầng Model
3.3. Tầng View
3.3. Tầng Controller
3.4. Ví dụ minh họa


4. Một số khái niệm cơ bản trong Ruby On Rails
4.1. ORM
4.2. Active Record
4.3. Rails Model
4.4. Migration
4.5. Validations
4.6. Associations
4.7. Action Pack
4.8. Routing
5. Mô tả tổng quát codebase
5.1. Tập Tin Gemfile và Gemfile.lock
5.2. Thư mục app
5.2.1. Thư mục controllers
5.2.2. Thư mục models
5.2.3. Thư mục views
5.2.4. Thư mục assets

10
10
10
12
13
13
13
14
15
15
15
16
17

18
18
19
20
22
22
23
23
23
23
24


Tìm hiểu về Docker và Ruby On Rails
5.2.5. Thư mục javascripts
5.3. Thư mục config
5.4. Thư mục db
III. DOCKER
1. Sự ra đời của Docker:
2. Khái niệm Docker:

24
24
24
25
25
26

2.1 Quá trình hình thành:
2.2 Docker là gì?


26
28

3. Chức năng, vai trị của Docker

30

3.1 Chức năng:
3.2 Vai trò:

30
30

4. Các khái niệm cơ bản

31

4.1. Docker Engine
4.1.1. Image
DockerFile
4.1.2. Container
4.1.2. Network
4.1.2. Volume
4.2. Công cụ phân tán (Distribution tools)
4.2.1. Docker Registry:
4.2.2. Docker Hub
4. Kiến trúc của Docker:
5. Các câu lệnh cơ bản của Docker:
5.1. Image

5.1.1. Liệt kê các image có trong hệ thống.
5.1.2. Tải 1 image về hệ thống.
5.1.3. Xóa 1 image ra khỏi hệ thống.
5.1.4. Lưu image thành file ở trên hệ thống máy host
5.1.5. Ép xóa image dù đang chạy 1 container
5.1.6. Kiểm tra lịch sử hình thành nên image
5.1.7. Tra cứu thông tin của 1 image
5.2. Container
5.2.1. Kiểm tra container nào đang chạy
5.2.2. Chạy 1 container
5.2.3. Kiểm tra các container đang không chạy

31
31
32
33
35
35
35
35
36
36
39
39
39
39
39
39
39
39

39
40
40
40
40


Tìm hiểu về Docker và Ruby On Rails
5.2.4. Khởi chạy 1 container đang dừng
5.2.5. Truy cập vào container đang chạy
5.2.6. Ép dừng 1 container
5.2.7. Đặt tên và hostname cho container
5.2.8. Xóa 1 container
5.2.9. Xóa container đang chạy
5.2.10. Cài 1 số gói phần mềm trong container
5.2.11. Lưu container thành 1 image
5.2.12. Tra cứu thông tin của 1 container
5.2.13. Kiểm tra lỗi bên trong 1 container
5.2.14. Lấy N-dòng log cuối cùng
5.2.15. Lấy log của container đang chạy
5.2.16. Giám sát tài nguyên container sử dụng
5.4. Network
5.4.1. Tải busybox
5.4.2. Kiểm tra đang có những mạng nào
5.4.3. Kiểm tra thông tin của 1 network
5.4.4. Chạy container ánh xạ cổng mạng trong docker
5.4.5. Tạo mạng cầu
5.4.6. Xóa mạng cầu
5.4.5. Chạy container truy cập mạng network
5.5. Volume

5.5.1. Kiểm tra đang sử dụng ổ đĩa nào
5.5.2. Tạo ổ đĩa
5.5.3. Kiểm tra thơng tin ổ đĩa
5.5.4. Xóa ổ đĩa
5.5.5. Gán ổ đĩa vào container
5.5.6. Tạo ra ổ đĩa mà nó ánh xạ đến thư mục cụ thể của máy host
5.4. DockerFile
5.4.1. Tạo 1 Dockerfile trong docker
5.4.2. Từ Dockerfile phát sinh ra image tương ứng
5.5. Docker Compose
5.5.1. Tạo file Docker Compose
5.5.2. Thực thi file Docker Compose
IV. DOCKER SWARM

40
40
40
40
40
40
41
41
41
41
41
41
41
41
41
41

42
42
42
42
42
42
42
42
42
42
43
43
43
43
43
43
43
44
45


Tìm hiểu về Docker và Ruby On Rails
1. Điều phối container (Container orchestration)
1.1. Docker Machine
1.2. Docker Compose
1.3. Công cụ điều phối
2. Giới thiệu về Docker Swarm
3. Thành phần trong Docker Swarm
3.1. Swarm (Cluster)
3.2. Node

3.2.1 Manager (Node)
3.2.2. Worker (Node)
4. Service và Task trong Docker Swarm
4.1. Service
4.2. Task
5. Docker Stack
6. Tính năng nổi bật
6.1. Tính mở rộng (Scaling):
6.2. Desired state reconciliation:
6.3. Multi-host networking:
6.4. Service discovery:
6.5. Load balancing:
6.6. Bảo mật
6.7. Rolling updates
6.8. Khả năng chịu lỗi
7. Network trong Docker
7.1. Mạng Local - Bridge
7.2. Mạng Overlay
7.2.1. Mạng Ingress (Overlay mặc định)
7.2.2. Tự cấu hình mạng Overlay

45
45
45
46
48
49
50
50
50

51
51
51
52
53
53
53
54
54
54
55
55
55
55
57
58
59
61
62

V. XÂY DỰNG ỨNG DỤNG MINH HỌA
1. Giới thiệu ứng dụng minh họa
1.1. Bài toán thực tế
1.2. Hướng giải quyết
1.3. Tổng quan kiến trúc ứng dụng đã phát triển
2. Product Requirement Document
2.1. Objective

63
63

63
63
64
65
65


Tìm hiểu về Docker và Ruby On Rails
2.2. Release
2.3. Feature
2.3.1. Đặt phịng cho khách lẻ
2.3.2. Đặt phịng cho khách đồn
2.3.3. Gán phịng cho khách đồn
2.3.4. Nhận phịng cho khách lẻ
2.3.5. Nhận phịng cho khách đồn
2.3.6. Trả phịng cho khách lẻ
2.3.7. Trả phịng cho khách đồn
2.4. Analytics - Phân tích
2.5. Future work - Hướng phát triển
3. User flow and design
3.1. Phân hệ lễ tân
3.1.1. Sơ đồ phịng
3.1.2. Khách lẻ
3.1.3. Khách đồn
3.2. Phân hệ dịch vụ
3.3. Cấu hình
3.3.1. Phịng
3.3.2. Loại phịng
3.3.3. Nhân viên
3.3.4. Khách hàng

3.3.5. Dịch vụ

66
68
68
69
71
72
73
75
76
77
77
79
79
79
80
80
81
82
82
83
84
85
86

V. HƯỚNG DẪN ĐÓNG GÓI ỨNG DỤNG
1. Kiến trúc
2. Tạo Dockerfile
4. Tạo docker-compose.yml

5. Entrypoint để run scripts
6.Truyền biến môi trường
7. Build Docker-compose

87
87
88
89
91
92
93

VI. HƯỚNG DẪN SCALE UP BẰNG DOCKER SWARM
1. Chuẩn bị môi trường:
2. Sử dụng CLI
2.1. Khởi tạo Docker Swarm

94
94
95
95


Tìm hiểu về Docker và Ruby On Rails
2.2. Tạo service:
2.3. Sự điều phối của node manager:
2.4. Scale up
3. Sử dụng GUI
3.1. Cài đặt SwarmPit trong node manager
3.2. Truy cập vào Play With Docker

3.3. Làm quen với Play With Docker
3.3.1. Tạo Node mới
3.3.2. Sử dụng Editor
3.3.3. Sử dụng CLI
3.4. Khởi chạy SwarmPit
3.5. Task
3.6. Service
3.6.1. Tạo Service
3.5.2. Chỉnh sửa Service
3.7. Stack
3.7.1. Tạo Stack
3.7.2. Chỉnh sửa Stack

96
97
98
100
101
101
104
104
106
109
110
110
111
112
114
114
115

116

VII. KẾT QUẢ ĐẠT ĐƯỢC VÀ HƯỚNG PHÁT TRIỂN
1. Kết quả đạt được:
1.1. Ưu điểm
1.2. Nhược điểm
2. Hướng phát triển:

118
118
118
118
118

TÀI LIỆU THAM KHẢO

118


Tìm hiểu về Docker và Ruby On Rails

I. GIỚI THIỆU CHUNG
1. Thơng tin nhóm
Nhóm gồm 2 thành viên:
-

Thành viên 1

: Nguyễn Đắc Thiên Ngân


MSSV : 18520109

-

Lớp

: PMCL2018.1

Email

:

Thành viên 2

: Ung Bảo Tiên

MSSV

: 18520168

Lớp

: PMCL2018.1

Email

:

2. Tổng quan đề tài:
2.1. Giới thiệu đề tài

Đề tài: Tìm hiểu Docker và xây dựng ứng dụng.
Công nghệ phát triển, hàng loạt các ứng dụng được tạo ra, nhiều ngơn ngữ lập
trình mới hình thành nhằm đáp ứng nhu cầu cụ thể nào đó. Những ngơn ngữ lập trình
khác nhau lại u cầu các phần mềm hỗ trợ, gói thư viện và mơi trường khác nhau. Mỗi
lần cài đặt, sẽ tốn nhiều công sức và thời gian.
Ví dụ đang làm việc lập trình Android, nhưng muốn làm việc với hệ điều hành
iOS thì phải cài thêm OS để triển khai được các ứng dụng Python, Java, Scala…. phải
tiến hành cài đặt hàng tá môi trường. Đó là chưa kể xung đột phần mềm, port… và vấn đề
là sẽ thật kinh khủng nếu xảy ra xung đột phần mềm và làm ảnh hưởng đến hoạt động của
các ứng dụng đang hoạt động trên máy tính.
Chính vì thế Docker ra đời, nó có thể triển khai bất cứ nơi đâu do không phụ thuộc
vào OS và cơ sở hạ tầng, thời gian khởi động cực nhanh và khi nhiều người cùng phát


Tìm hiểu về Docker và Ruby On Rails
triển một dự án sẽ không sợ sai khác về môi trường. Do đó nhóm chúng em lựa chọn
Docker để hỗ trợ đóng gói và mở rộng phần mềm
Về xây dựng ứng dụng, chúng em nhận thấy có 1 web framework hỗ trợ các lập
trình viên việc phát triển các phần mềm nền web một cách nhanh nhất có thể, đó là Ruby
On Rails. Từ đó, nhóm chúng em quyết định xây dựng ứng dụng Quản lý khách sạn bằng
Ruby On Rails. Phần mềm gồm các tính năng:
Đặt phịng cho khách lẻ, khách đồn
Nhận phịng cho khách lẻ, khách đồn
Gán phịng tự động cho khách đồn
Trả phịng cho khách lẻ, khách đồn
Theo dõi trạng thái phòng bằng màu sắc
Hỗ trợ việc chỉnh sửa cấu hình như quản lý nhân viên, quản lý khách hàng, giá
phịng, phịng,...

2.2. Phạm vi nghiên cứu

Nhóm tập trung nghiên cứu và tìm hiểu về Docker, Docker Swarm và Ruby On
Rails cũng như áp dụng các nghiên cứu này vào việc xây dựng ứng dụng minh họa để
giúp có cái nhìn tổng quan và hiểu sâu hơn.

2.3. Nội dung nghiên cứu
Tiến hành nghiên cứu chi tiết về các thành phần và kiến trúc của Docker, cách
thức hoạt động cũng như làm quen với các câu lệnh của Docker và Docker Swarm. Kèm
theo đó là xây dựng ứng dụng minh họa bằng Ruby On Rails.

2.4. Kết quả hướng tới:
-

Phần mềm Quản lý khách sạn được xây dựng bằng Ruby On Rails

-

Sử dụng Docker để đóng gói và hỗ trợ mở rộng phần mềm

-

Mở rộng việc triển khai và điều phối bằng Docker Swarm và Swarm Pit


Tìm hiểu về Docker và Ruby On Rails

3. Cơng cụ sử dụng:
-

Đóng gói ứng dụng bằng Docker


-

Xây dựng ứng dụng bằng Ruby On Rails

-

Xây dựng cơ sở dữ liệu trên PostgreSQL

-

Mở rộng việc triển khai bằng Docker Swarm và SwarmPit

II. RUBY ON RAILS
1. Khái niệm Ruby on Rails
Ruby on Rails (RoR) là một web framework được viết bằng ngôn ngữ Ruby và tất
cả các ứng dụng trong Rails sẽ được viết bằng Ruby. Ruby on Rails được tạo ra để hỗ trợ
các lập trình viên việc phát triển các phần mềm nền web một cách nhanh nhất có thể.

2. Tại sao lại chọn Ruby on Rails?
Ruby on Rails cung cấp một quy trình phát triển nhanh chóng, đây chính là yếu tố
mang lại lợi thế và sự thuận lợi khi sử dụng nó.
Ruby là ngơn ngữ script, định nghĩa kiểu động và là một ngơn ngữ hướng đối
tượng, nó được thiết kế với một cú pháp trong sáng, tạo cảm giác dễ đọc, và viết code
ngắn gọn nhất có thể đối với người dùng
VD:
-

Không cần dấu chấm phẩy khi kết thúc câu lệnh

-


Không cần các dấu ngoặc đơn khi khai báo các phương thức

-

Có những đoạn code thậm chí được viết giống như việc chúng ta viết tiếng anh


Tìm hiểu về Docker và Ruby On Rails
Framework này hoạt động chủ yếu dựa trên hai nguyên tắc Don’t Repeat Yourself
(DRY) – Đừng lặp lại những gì giống nhau và Convention Over Configuration – Quy ước
dựa trên cấu hình.
Nguyên tắc đầu tiên Don’t Repeat Yourself
Đây có nghĩa là, RoR giúp các developers loại bỏ việc lặp đi lặp lại những công
việc coding giống nhau.
Nguyên tắc thứ hai Convention Over Configuration
Đây có nghĩa là mơi trường mà developer đang làm việc, chẳng hạn như các hệ
thống, các thư viện, các ngôn ngữ, v.v… cho phép sử dụng nhiều tình huống hoặc xử lý
logic theo mặc định.
Điều đó có nghĩa là developer có thể thích nghi với chúng, thay vì tạo ra những quy tắc
hay custom của riêng của mình cho mỗi lần dùng, giúp cho tồn bộ q trình lập trình trở
nên dễ dàng hơn rất nhiều.
RoR sử dụng các quy ước triệt để và đảm nhận xử lý rất nhiều các task khiến
người lập trình viên khơng phải bận tâm về nó, điều này khơng chỉ giúp các lập trình viên
viết code ít hơn, phát triển ứng dụng nhanh hơn mà cịn làm ứng dụng dễ hiểu và dễ bảo
trì hơn.


Tìm hiểu về Docker và Ruby On Rails


3. Kiến trúc Ruby On Rails

RoR sử dụng các mẫu kiến trúc Model – View – Controller(MVC) để tăng cường
khả năng bảo trì và phát triển của ứng dụng. MVC cho phép chúng ta chia ứng dụng
thành các tầng xử lý logic, nghiệp vụ và giao diện người dùng một cách rõ ràng, điều này
cũng giúp cho việc kiểm thử và tái sử dụng code được dễ dàng hơn.


Tìm hiểu về Docker và Ruby On Rails

3.1. Tầng Model
Tầng Model xử lý các nghiệp vụ của ứng dụng và trực tiếp thao tác với dữ liệu.
Trong RoR, tầng model thường được sử dụng để tương tác với các thành phần tương ứng
với chúng trong cơ sở dữ liệu và validate dữ liệu.
Hệ thống con này được triển khai trong thư viện ActiveRecord, cung cấp giao diện
và ràng buộc giữa các bảng trong cơ sở dữ liệu quan hệ và mã chương trình Ruby thao tác
các bản ghi cơ sở dữ liệu. Tên phương thức Ruby được tạo tự động từ tên trường của các
bảng cơ sở dữ liệu.

3.3. Tầng View
Tầng view hiển thị giao diện người dùng, trong RoR các view là các file HTML
được nhúng cùng với các đoạn mã Ruby.
Hệ thống con này được triển khai trong thư viện ActionView, là hệ thống dựa trên
Ruby nhúng (Erb) để xác định các mẫu trình bày để trình bày dữ liệu.
Các đoạn mã Ruby được nhúng trong HTML file là khá đơn giản, thường chỉ gồm
các vòng lặp và các lệnh điều kiện rẽ nhánh, nó được sử dụng để hiển thị dữ liệu lên form
của view.

3.3. Tầng Controller
Controller tương tác với model và view. Các request đến từ trình duyệt sẽ được xử

lý bởi controller, sau đó controller có thể sẽ tương tác với model (Active Record) để lấy
dữ liệu sau đó trả về cho view (ActionView) để hiển thị thông tin


Tìm hiểu về Docker và Ruby On Rails

3.4. Ví dụ minh họa

(1) Từ trình duyệt gửi request của URL「/users」lên Rails server.
(2) [/users」request được gán cho index action trong Users controller nhờ cơ chế
routing của Rails.
(3) Thực hiện index action, từ đó gửi u cầu get tồn bộ user (User.all) đến User
model.
(4) User model tiếp nhận yêu cầu, get toàn bộ user từ database.
(5) Từ User model trả về cho controller danh sách toàn bộ user đã get được từ
database.
(6) Users controller lưu danh sách user vào biến @users rồi chuyển qua index view.
(7) Index view khởi động, chạy ERB (Embedded RuBy) tạo (rendering) HTML.
(8) Controller tiếp nhận HTML đã tạo ở view rồi trả về cho trình duyệt.


Tìm hiểu về Docker và Ruby On Rails

4. Một số khái niệm cơ bản trong Ruby On Rails
4.1. ORM
Trong quá khứ, để xây dựng một ứng dụng web, lập trình viên cần phải có cả kĩ
năng viết code ở cả business language và database language. Làm việc với các database
language không phải là điều dễ chịu đối với các coder, đặc biệt là khi bạn phải đối mặt
với việc thao tác dữ liệu trên nhiều table khác nhau kết hợp cùng các data-filter. Và ORM
ra đời như một cứu cánh cho dân lập trình.

ORM là viết tắt của cụm từ Object Relational Mapping là một kĩ năng trong lập
trình giúp chuyển đổi dữ liệu giữa các hệ thống không tương thích trong lập trình hướng
đối tượng. Nó tạo ra một Cơ sở dữ liệu object ảo, có thể sử dụng được bên trong ngơn
ngữ lập trình.
Nói cách khác, một ORM framework là một layer nằm ở giữa ngôn ngữ lập trình
và database, được viết bằng một ngơn ngữ lập trình hướng đối tượng (như là Ruby,
Python, PHP ...) giúp bạn có thể sử dụng chính ngơn ngữ lập trình đó để thao tác với
database mà không cần viết các câu lệnh SQL dài dòng. Các object class sẽ tương ứng
với các bảng dữ liệu trong database, và các object instance sẽ tương ứng với các record
trong các bảng dữ liệu đó.

4.2. Active Record
Bạn đã biết ORM là gì, chúng ta hãy tìm hiểu tiếp về Active Record. Phần sau đây
sẽ giới thiệu một cách đơn giản về các tính năng cũng như cách sử dụng của Active
Record.
Bạn có biết Rails thực chất là tổng hợp của 7 gem Ruby hoạt động cùng nhau.
Trong đó, Active Record chính là gem đóng vai trị của một ORM, có nhiệm vụ xử lý các
thao tác liên quan tới database. Active Record lấy những data được lưu trữ trong các bảng
của database sử dụng các row và column. Việc truy xuất hoặc sửa đổi các data này vốn


Tìm hiểu về Docker và Ruby On Rails
được thực hiện bởi các câu lệnh SQL (nếu bạn sử dụng SQL database), nay đã được đơn
giản hoá thành việc thao tác với các Ruby object thông thường.
Nếu bạn muốn lấy một mảng bao gồm tất cả user, thay vì phải viết code để khởi
tạo liên kết tới database và viết các query như SELECT * FROM users, rồi convert kết
quả đó sang dạng mảng, bạn chỉ cần viết User.all và Active Record sẽ lấy về cho bạn một
mảng bao gồm tất cả các user của bạn.
Ấn tượng hơn nữa, bạn không cần phải quan tâm nhiều tới việc mình sử dụng
database gì (nếu bạn thiết lập chuẩn xác trong file config/database.yml), Active Record

đã lo cho bạn việc đồng nhất xử lý đối với các database khác nhau. Bạn chỉ cần tập trung
viết code cho ứng dụng của mình. Điều này cũng đồng nghĩa với việc, khi bạn sửa đổi
database, bạn không cần thiết phải chỉnh sửa nhiều code trong ứng dụng mà chỉ là vài
dòng trong file thiết lập.

4.3. Rails Model
Active Record giao tiếp với database, nó đóng vai trị là phần M trong MVC của
Rails: models. Model là nơi xử lý hầu hết các business logic trong ứng dụng của bạn. Bạn
muốn lưu giữ thông tin về các users của mình, bạn tạo một bảng trong database đặt tên là
users. Bạn muốn truy nhập vào bảng đó từ trong ứng dụng của bạn, bạn tạo một model
đặt tên là User. Một bảng trong database sẽ tương ứng với một model được thừa kế từ
Active Record. Chỉ thế thôi, bạn đã có thể sử dụng các phương thức vơ cùng tiện lợi như
all, find và create …
Sau khi khởi tạo một project Rails sử dụng các câu lệnh:
rails new myapp
cd myapp

Và tạo ra database:

rake db:create


Tìm hiểu về Docker và Ruby On Rails
Bạn có thể tạo ra model như sau (cả 3 kiểu ở dưới đây đều có thể hoạt động):
rails generate model User
rails g model User
rails g model User name:string age:integer

Hai câu lệnh đầu tiên làm cùng một việc, ở đây rails g chỉ là một shortcut của rails
generate. Câu lệnh thứ ba sẽ tạo thêm một số thơng tin, đó là thêm vào hai trường name

(kiểu string) và age (kiểu integer) cho model User. Bên cạnh đó, sẽ có thêm 2 file được
tạo ra, dạng như sau
create db/migrate/20130213204626_create_users.rb
create

app/models/user.rb

File đầu tiên, là một file migrate, sử dụng để sửa database. Ta sẽ nói tới migration
sau. File thứ hai, chính là một class của Ruby, class này kế thừa từ Active Record.
Đến đây, sau khi thực hiện migration, bạn sẽ có thể sử dụng các câu lệnh của
Active Record đối với model user.
Tạo ra một record user thật đơn giản. Bạn chỉ cần gọi method create của class User
và truyền vào đó tham số là một Hash bao gồm các key và value là các trường của model
User và các giá trị tương ứng.
User.create(name: “Cuong”, age: 69)

4.4. Migration
Bạn cần migration khi nào? Đó là khi bạn cần những sự thay đổi về cấu trúc
database. Bạn sẽ định nghĩa những thay đổi đó sử dụng các câu lệnh của Rails, các file
migration sẽ được tạo ra và bạn chạy câu lệnh

rake db:migrate

để cập nhật các thay đổi này

vào database.
Cấu trúc một file migration có thể như sau:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|

t.string :name


Tìm hiểu về Docker và Ruby On Rails
t.integer :age
t.timestamps
end
end
End

Bạn cũng có thể đảo ngược q trình thay đổi database mà bạn vừa tạo ra với câu
lệnh

rake db:rollback

4.5. Validations
Validation là một phần quan trọng của mọi ứng dụng Web. Đây là nơi ta đưa ra các
điều kiện để chắc chắn rằng những dữ liệu được đưa vào trong database là chính xác và
đúng chuẩn.
Phải nói thêm rằng, các luật validation được tạo ra trong model của bạn không
được thực hiện ở cấp độ database mà nó chỉ được đưa vào trong các xử lý của Rails.
Trong version hiện tại của Rails, chúng ta sử dụng method validates để thiết lập tất
cả các validation. Tham số của method này bao gồm các trường của model và các thuộc
tính validation. Rails hỗ trợ rất nhiều kiểu validation, như là presence, uniqueness,
inclusion, exclusion, length ...
Một ví dụ của validation:

validates :age, presence: true

4.6. Associations

Hầu hết các relational database đều có nhiều các bảng có mối liên hệ với nhau. Tất
nhiên Active Record có cơ chế để thiết lập các liên kết đó.
Ví dụ như: ngồi model User, chúng ta cịn có thêm một model là Account , và
một user có thể có nhiều account. Làm thế nào ta có thể tạo được liên kết này.
Đầu tiên hãy tạo ra model account:
rails g model Account balance:integer, user_id:integer

Ở đây trường user_id chính là foreign key ta sử dụng để liên kết giữa hai model.


Tìm hiểu về Docker và Ruby On Rails
Sau khi chạy migration rake db:migrate, ta đã có thể thơng báo cho các class về mối
liên hệ giữa hai model.
Trong class app/model/user.rb thêm dòng sau:
has_many :accounts

Trong class app/model/account.rb
belongs_to :user

Như vậy, trong model User ta định nghĩa rằng một user có thể có nhiều account,
và ngược lại mỗi account đều thuộc về user.

4.7. Action Pack
Mô đun Action Pack cung cấp các lớp ở tầng controller và view trong mơ hình
MVC. Những mơ đun này tiếp nhận request từ client và sau đó ánh xạ chúng đến các
action tương ứng. những action này được định nghĩa trong tầng controller và sau đó các
action này sẽ render view hiển thị lên trình duyệt. Action Pack được chia thành 3 mơ đun
con, đó là:
Action Dispatch: xử lý routing các request, nó parse các request và xử lý một vài
quá trình liên quan đến giao thức HTTP như xử lý cookies, session…

Action Controller: Sau khi Action Dispatch xử lý request nó sẽ routing các request
đến các controller tương ứng, Mô đun này cung cấp các base controller tất để các
controller khác có thể kế thừa từ nó. Action Controller chứa các action để điều khiển
model và view, thêm vào đó nó quản lý các session người dùng , luồng chảy ứng dụng,
caching, mô đun helper và các thực thi các bộ lọc trong các quá trình tiền xử lý.
Action View: Được gọi bởi Action Controller. Nó render các view khi có yêu cầu,
Action View cung cấp các master layouts, templates và các view helpers , các thành phần
này hỗ trợ việc sinh tự động ra phần khung cho các trang HTML hay các định dạng khác.


Tìm hiểu về Docker và Ruby On Rails
Có 3 template trong Rails là : rhtml, rxml và rjs. Định dạng rhtml sinh ra các view
HTML cho người dùng có nhúng thêm các đoạn code Ruby (ERB), rxml được sử dụng
để xây dựng các tài liệu XML, rjs cho phép tạo ra các đoạn mã động JavaScript để thực
thi các AJAX functionality.

4.8. Routing
Routing là tính năng điều hướng một URL vào một phương thức nhất định, tính
năng routing có trong hầu hết các web framework phổ biến. Trong Ruby on Rails, routing
được định nghĩa trong file config/routes.rb, được viết bằng ruby thuần và có thể hoạt
động với mọi web server. Vì thế, việc tạo các router sẽ trở nên đơn giản, có thể coi như
vẽ bản đồ cho các HTTP request biết đi đến đâu.
Cách định nghĩa đơn giản ở trong file config/routes.rb:
Rails.application.routes.draw do
get 'photos/:id' => 'photos#show', :defaults => { :format => 'jpg' }
end

Ở 3 dòng code trên, ta đã định nghĩa một đường đi đơn giản minh họa cho phương
thức Get của giao thức HTTP. Việc định nghĩa như trên sẽ giúp ta cho Rails biết rằng ta
muốn get hình ảnh dựa trên id của hình ảnh, và Rails phải tự tìm đến controller Photos và

tìm đến action Show.
Thơng thường, nếu muốn định nghĩa đầy đủ CRUD (Thêm xóa sửa xem), ta phải
định nghĩa đầy đủ các phương thức Get, Post, Put, Delete của giao thức HTTP.
Với mục đích giúp các nhà phát triển chỉ tập trung vào việc xử lý nghiệp vụ, các
công đoạn cồng kềnh tốn thời gian như trên sẽ được Rails hỗ trợ tối đa với dòng lệnh này:
resources :users

Rails giúp việc tạo các route phổ biến theo chuẩn RESTful một cách nhanh chóng.
Cụ thể là 7 route khác nhau tương ứng với các action trong User controller:


Tìm hiểu về Docker và Ruby On Rails

HTTP Verb

Path

Controller#Action

Mục đích sử
dụng

GET

/users

users#index

Hiển thị tất cả users_path
các users


GET

/users/new

users#new

Trả về HTML new_user_path
form để tạo
mới một user

POST

/users

users#create

Tạo mới user

users_path

GET

/users/:id

users#show

Hiển thị một
user cụ thể


user_path(:id)

GET

/users/:id/edit

users#edit

Trả về HTML edit_user_path(:id
form để thay )
đổi một user

PATCH/PUT /users/:id

users#update

Thay đổi một
user cụ thể

user_path(:id)

DELETE

users#destroy

Xóa một user
cụ thể

user_path(:id)


/users/:id

Helper sinh ra


Tìm hiểu về Docker và Ruby On Rails

5. Mơ tả tổng quát codebase

5.1. Tập Tin Gemfile và Gemfile.lock
Tập tin Gemfile dùng để liệt kê những gem nào dùng trong ứng dụng và Gemfile.lock
dùng để ghi lại thông tin về quá trình cài đặt các gem.


Tìm hiểu về Docker và Ruby On Rails

5.2. Thư mục app
Thư mục này chứa các controllers, models, views, helpers, mailers và assets cho ứng
dụng. Trong đó:
5.2.1. Thư mục controllers
Chứa tất cả các file controller dùng để điều hướng luồng chạy của ứng dụng.
Việc đặt tên của file này bắt buộc phải theo quy tắc là số nhiều của tên model +
"_controller".
Ví dụ bạn có model User thì tên controller được đặt sẽ là users_controller.rb, nó theo
khiểu snack_case.
Cịn trong file, class controller sẽ theo CamelCase tức là UsersController

5.2.2. Thư mục models
Chứa tất cả các file models được dùng để tương tác với database trong ứng dụng.
Models đóng vai trị như đối tượng quan hệ sẽ mapping với database table chứa dữ liệu.

Quy tắc đặt model sẽ là viết các object table trong DB ở dạng số ít app/models/concerns
Giống như controller, method ở đây sẽ được dùng ở nhiều model files

5.2.3. Thư mục views
Các tập tin views được sử dụng bởi controller dùng để hiển thị nội dung của trang (Gồm
các file html.erb).
Những file cần hiển thị hoặc mails cũng như response api sẽ được viết trong phần này.
Thường những file ở đây nếu là web sẽ là kết hợp giữa HTML và Ruby với extension sẽ
là html.erb và được tổ chức dựa trên controller. Ví dụ, BooksController#index action sẽ
có view tương ứng ở file app/views/books/index.html.erb.


Tìm hiểu về Docker và Ruby On Rails
Ngồi ra các file layout sẽ được đặt tại đây app/views/layouts. Nó như là một layout tổng
và được kế thừa ở các views khác. Ngồi ra bạn cũng có thể dùng nhiều layout và tương
ứng với controller tổng mà bạn muốn.

5.2.4. Thư mục assets
Bao gồm các tập tin như images, icons, css / scss,..
5.2.5. Thư mục javascripts
Bao gồm các file javascripts do công cụ Webpacker quản lý (Từ Rails 6 trở đi)

5.3. Thư mục config
Thư mục này dùng để cấu hình ứng dụng như cấu hình các thơng số của database, định
nghĩa các routes…
File config/routes.rb xử lý routing như vẽ bản đồ cho các HTTP Request biết đi đến đâu.

5.4. Thư mục db
Thư mục này chứa các tập tin dùng để tạo cấu trúc schema cho database và các tập tin
migrations.



Tìm hiểu về Docker và Ruby On Rails

III. DOCKER

1. Sự ra đời của Docker:
Docker là một nền tảng mã nguồn mở cung cấp cho người sử dụng những công cụ để có
thể đóng gói, vận chuyển và chạy container một cách đơn giản và dễ dàng trên các nền
tảng khác nhau một cách nhanh nhất với tiêu chí - “Build once, run anywhere”. Docker
thực hiện ảo hóa ở mức hệ điều hành. Mỗi container là cô lập (isolated) với nhau nhưng
đều dùng chung một số bin/lib và kernel của Host OS. Docker có thể làm việc trên nhiều
nền tảng khác nhau như Linux, Microsoft Windows và Apple OS X. Ngoài ra, Docker
cịn hỗ trợ nhiều dịch vụ điện tốn đám mây nổi tiếng như Microsoft Azure hay Amazon
Web Services.


×