Tầng ModelTầ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 ứngvới chúng trong
Trang 2Tìm hiểu về Docker và Ruby On Rails
Trang 35.2.5 Thư mục javascripts 24
5.1.1 Liệt kê các image có trong hệ thống 39
5.1.4 Lưu image thành file ở trên hệ thống máy host 395.1.5 Ép xóa image dù đang chạy 1 container 395.1.6 Kiểm tra lịch sử hình thành nên image 39
Trang 4Tìm hiểu về Docker và Ruby On Rails
5.2.10 Cài 1 số gói phần mềm trong container 41
5.2.13 Kiểm tra lỗi bên trong 1 container 41
5.2.16 Giám sát tài nguyên container sử dụng 41
5.4.4 Chạy container ánh xạ cổng mạng trong docker 42
5.5.6 Tạo ra ổ đĩa mà nó ánh xạ đến thư mục cụ thể của máy host 43
5.4.2 Từ Dockerfile phát sinh ra image tương ứng 43
Trang 51 Điều phối container (Container orchestration) 45
1.3 Tổng quan kiến trúc ứng dụng đã phát triển 64
Trang 6Tìm hiểu về Docker và Ruby On Rails
Trang 72.2 Tạo service: 96
Trang 8Tì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 : 18520109Lớp : PMCL2018.1Email : 18520109@gm.uit.edu.vn
- Thành viên 2 : Ung Bảo Tiên
MSSV : 18520168Lớp : PMCL2018.1Email : 18520168@gm.uit.edu.vn
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ậptrì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ìnhkhác nhau lại yê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ỗilầ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ànhiOS thì phải cài thêm OS để triển khai được các ứng dụng Python, Java, Scala… phảitiế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ủacá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ộcvà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
Trang 9triể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ọnDocker để 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ậptrì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ằngRuby On Rails Phần mềm gồm các tính năng:
Đặt phòng cho khách lẻ, khách đoàn
Nhận phòng cho khách lẻ, khách đoàn
Gán phòng tự động cho khách đoàn
Trả phòng cho khách lẻ, khách đoà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 OnRails 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áchthứ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èmtheo đó 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
Trang 10Tì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 đốitượ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 codengắ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
Trang 11Framework 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 ướcdự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ôngviệ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ắchay custom của riêng của mình cho mỗi lần dùng, giúp cho toàn bộ quá 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ếnngườ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ênviế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ảotrì hơn
Trang 12Tì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ườngkhả 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ụngthà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àycũng giúp cho việc kiểm thử và tái sử dụng code được dễ dàng hơn
Trang 133.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 ứngvớ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áccá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ácbảng cơ sở dữ liệu
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
Trang 14Tì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 yêu cầu get toàn bộ user (User.all) đến Usermodel
(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
Trang 154 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 databaselanguage 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ặtvớ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ậptrì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ônngữ 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ớidatabase 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 ứngvới các bảng dữ liệu trong database, và các object instance sẽ tương ứng với các recordtrong 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 ActiveRecord
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ácthao tác liên quan tới database Active Record lấy những data được lưu trữ trong các bảngcủ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
Trang 16Tì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 đơngiả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ộtmả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 trungviế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 đổidatabase, 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àidò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ủaRails: models Model là nơi xử lý hầu hết các business logic trong ứng dụng của bạn Bạnmuố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
Trang 17Bạ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 railsgenerate 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 đượctạ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 migrationsau 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ủaActive 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 modelUser 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úcdatabase Bạn sẽ định nghĩa những thay đổi đó sử dụng các câu lệnh của Rails, các filemigration 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àyvà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
Trang 18Tì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 quá trình thay đổi database mà bạn vừa tạo ra với câulệ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ộctí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
Đầ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
Trang 19Sau khi chạy migrationrake db:migrate, ta đã có thể thông báo cho các class về mốiliê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ìnhMVC Những mô đun này tiếp nhận request từ client và sau đó ánh xạ chúng đến cácaction tương ứng những action này được định nghĩa trong tầng controller và sau đó cácaction này sẽ render view hiển thị lên trình duyệt Action Pack được chia thành 3 mô đuncon, đó là:
Action Dispatch: xử lý routing các request, nó parse các request và xử lý một vàiquá 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áccontroller khác có thể kế thừa từ nó Action Controller chứa các action để điều khiểnmodel 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ầnnà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
Trang 20Tì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 viewHTML 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ựcthi 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ínhnă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:
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áccô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:
Trang 21HTTP Verb Path Controller#Action Mục đích sử
new_user_path
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
form để thayđổi một user
edit_user_path(:id)
PATCH/PUT /users/:id users#update Thay đổi một
user cụ thể user_path(:id)
DELETE /users/:id users#destroy Xóa một user
cụ thể
user_path(:id)
Trang 22Tì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.lockdùng để ghi lại thông tin về quá trình cài đặt các gem
Trang 235.2 Thư mục app
Thư mục này chứa các controllers, models, views, helpers, mailers và assets cho ứngdụ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 +
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/concernsGiống như controller, method ở đây sẽ được dùng ở nhiều model files
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
Trang 24Tìm hiểu về Docker và Ruby On Rails
Ngoà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 Ngoà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
Trang 25III 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ềntảng khác nhau một cách nhanh nhất với tiêu chí - “Build once, run anywhere” Dockerthự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ềunền tảng khác nhau như Linux, Microsoft Windows và Apple OS X Ngoài ra, Dockercòn hỗ trợ nhiều dịch vụ điện toán đám mây nổi tiếng như Microsoft Azure hay AmazonWeb Services
Trang 26Tìm hiểu về Docker và Ruby On Rails
2 Khái niệm Docker:
Trang 27Virtualization (ảo hóa) là một công nghệ được thiết kế để tạo ra một tầng trung
gian giữa phần cứng máy tính và phần mềm chạy trên nó Ảo hóa được xây dựng dựa trên
ý tưởng phân chia ổ đĩa, chúng phân chia máy chủ gốc thành nhiều máy chủ logic Từ đó,một máy chủ vật lý đơn giản có thể tạo thành nhiều máy ảo chạy độc lập, riêng rẽ vớinhau Các máy ảo đó có thể có hệ điều hành riêng, ứng dụng riêng, độc lập với các máy
Trang 28Tìm hiểu về Docker và Ruby On Rails
Containerization sử dụng các container, các container này sẽ sử dụng chung nhân
OS kernel với máy chủ host, điều này có nghĩa là khi container hoạt động cần tài nguyên, nó sẽ trực tiếp lấy từ máy host như một phần mềm bình thường chạy trên máy
host vậy, điều này tránh lãng phí tài nguyên từ máy ảo khi không sử dụng như trong côngnghệ virtualization Vậy thì công nghệ containerization dùng cái gì đây? Đó là Docker
2.2 Docker là gì?
Docker là 1 phần mềm chạy trên Linux hoặc Windows, cho phép dựng, kiểm thử
và triển khai ứng dụng một cách nhanh chóng Docker đóng gói phần mềm vào các đơn
vị tiêu chuẩn hóa được gọi là container
Docker sử dụng công nghệ ảo hóa containerization để triển khai các ứng dụng vào trongcontainer ảo hóa
Docker sử dụng nhân kernel linux để chạy các container, trên hệ điều hành LinuxDocker có thể sử dụng trực tiếp nhân của máy host; còn với các hệ điều hành Windows,MacOS – có thể vì lý do bảo mật nên docker không thể trực tiếp xài chung kernel với các
Trang 29hệ điều hành này nên trên các hệ điều hành này docker sẽ tạo ra một máy ảo virtual guestvới nhân linux để chạy các container.
Container là đơn vị phần mềm cung cấp cơ chế đóng gói ứng dụng, mã nguồn,
thiết lập, thư viện… vào một đối tượng duy nhất Ứng dụng sau khi được đóng gói có thểhoạt động một cách nhanh chóng và hiệu quả trên các môi trường điện toán khác nhau
Từ đó nó có thể tạo ra một môi trường hoàn hảo nơi mà có mọi thứ để chương trình cóthể hoạt động được, không chịu sự tác động từ môi trường của hệ thống cũng như khônglàm ảnh hưởng ngược lại về phía hệ thống chứa nó
Để tạo ra container phải kể đến 2 tính năng có trong nhân Linux đó là:
- Namespace: có nhiệm vụ cô lập các tài nguyên của hệ thống, khiến các tiến trình
"nhìn thấy" tập tài nguyên khác nhau
- Control groups (cgroups): giới hạn tài nguyên của mỗi ứng dụng, cho phép DockerEngine điều phối lượng tài nguyên phần cứng của mỗi ứng dụng, thiết lập các ràngbuộc
Ngoài ra, việc container được chia ra thành nhiều layer khác nhau cũng khiến choviệc quản lý tài nguyên được hiệu quả hơn
Cụ thể, container mới sẽ được xây dựng dựa trên các image layer dạng read-only.Trong mỗi container sẽ có thêm một layer với quyền read-write, mọi thay đổi củacontainer sẽ chỉ được ghi vào đây Như vậy, chỉ từ một vài image ban đầu chúng ta có thểtạo ra nhiều container khác nhau từ đó tiết kiệm được một phần không gian lưu trữ
Trang 30Tìm hiểu về Docker và Ruby On Rails
3 Chức năng, vai trò của Docker
3.1 Chức năng:
- Docker cho phép phát triển, di chuyển và chạy các ứng dụng dựa vào công nghệ
ảo hóa trong linux
- Tự động triển khai các ứng dụng bên trong các container bằng cách cung cấp thêmmột lớp trừu tượng và tự động hóa việc ảo hóa mức (OS)
- Docker có thể được sử dụng trên các hệ điều hành như: Windows, Linux, MacOS
Trang 31- Đồng nhất: không có sự sai khác về mặt môi trường khi triển khai ở bất kỳ nơiđâu, tạo ra sự nhất quán khi làm việc theo nhóm.
- Nhanh: do chia sẻ host OS nên các container có thể gần như được tạo một cách tứcthì, việc khởi động cũng diễn ra nhanh hơn rất nhiều
4 Các khái niệm cơ bản
4.1 Docker Engine
Docker Engine là phần cốt lõi của Docker, như một công cụ để đóng gói ứng
dụng, được xây dựng theo kiểu kiến trúc client-server và được cài đặt trên máy Host.
Docker Engine có 3 thành phần:
- Server: Docker Daemon (dockerd) dùng để tạo và quản lý các images, containers,networks, volumes
- Rest API: controller cho docker daemon, chỉ ra những gì docker daemon sẽ làm
- Client: Là một công cụ giúp người dùng giao tiếp với Docker host Người dùngtương tác với docker thông qua command trong terminal (CLI) Docker Client sẽ
sử dụng API gửi lệnh tới Docker Daemon
Có 4 đối tượng lớn trong thế giới của Docker Engine:
Image, Container, Network, Volume
4.1.1 Image
Một Docker Image là một read-only template dùng để tạo ra các containers
Image trong docker còn được gọi là mirror, nó là 1 đơn vị đóng gói chứa mọi thứ cầnthiết để 1 ứng dụng chạy
Image được tạo thành từ nhiều layer xếp chồng lên nhau, bên trong image là 1 hệ điềuhành bị cắt giảm và tất cả các phụ thuộc (dependencies) cần thiết để chạy 1 ứng dụng
Trang 32Tìm hiểu về Docker và Ruby On Rails
Ta có thể có được image docker bằng cách pulling từ image registry Thao tácpulling sẽ tải image xuống máy chủ docker, nơi docker có thể sử dụng nó để chạy 1 hoặcnhiều container
Thường thì image sẽ dựa trên 1 image có sẵn với những tùy chỉnh thêm Mộtimage sẽ được build dựa trên những chỉ dẫn của Dockerfile
DockerFile
Dockerfile là một file dạng text không có phần đuôi mở rộng, chứa các đặc tả vềmột trường thực thi phần mềm, cấu trúc cho Docker image Docker image có thể đượctạo ra tự động bằng cách đọc các chỉ dẫn trong Dockerfile Từ những câu lệnh đó, Docker
sẽ build ra Docker image (thường có dung lượng nhỏ từ vài MB đến lớn vài GB)
Trang 33Mỗi container bao gồm mọi thứ cần thiết để chạy được nó: code, runtime, systemtools, system libraries, setting Mỗi container như 1 hệ điều hành thực sự, bên trong mỗicontainer sẽ chạy 1 ứng dụng.
Container và VM có sự cách ly và phân bổ tài nguyên tương tự nhưng có chứcnăng khác nhau vì container ảo hóa hệ điều hành thay vì phần cứng Các container có tínhportable và hiệu quả hơn
Trang 34Tìm hiểu về Docker và Ruby On Rails
Container nhằm làm cho các ứng dụng trở nên dễ dàng xây dựng, di chuyển vàchạy Quá trình đưa 1 ứng dụng chạy trong container có để được hiểu như sau:
1 Đầu tiên ta bắt đầu với code app và các phụ thuộc của nó
2 Tạo Dockerfile mô tả ứng dụng, các phụ thuộc và cách chạy ứng dụng đó
3 Bulid Dockerfile thành image
4 Push image mới build vào registry(option)
5 Chạy container từ image
Trang 354.1.2 Network
Docker network có nhiệm vụ cung cấp private network (VLAN) để các containertrên một host có thể liên lạc được với nhau, hoặc các container trên nhiều hosts có thểliên lạc được với nhau (multi-host networking)
4.1.2 Volume
Docker volume là cơ chế tạo và sử dụng dữ liệu của docker, có nhiệm vụ lưu trữ
dữ liệu độc lập với vòng đời của container
Có 3 trường hợp sử dụng Docker Volume:
1 Giữ lại dữ liệu khi một Container bị xóa
2 Để chia sẻ dữ liệu giữa máy chủ vật lý và Docker Container
3 Chia sẻ dữ liệu giữa các Docker Container
4.2 Công cụ phân tán (Distribution tools)
4.2.1 Docker Registry:
Docker Registry là một dịch vụ máy chủ cho phép lưu trữ các docker image của cánhân, công ty, team,… Dịch vụ Docker Registry có thể được cung cấp bởi tổ chức thứ 3hoặc là dịch vụ nội bộ được xây dựng riêng nếu bạn muốn Một số dịch vụ DockerRegistry phổ biến như :
- Azure Container Registry
- Docker Hub
- Quay Enterprise
- Google Container Registry
- AWS Container Registry
Trang 36Tìm hiểu về Docker và Ruby On Rails
4.2.2 Docker Hub
Docker Hub là một “github for docker images” Trên Docker Hub có hàng ngànpublic images được tạo bởi cộng đồng cho phép bạn dễ dàng tìm thấy những image màbạn cần Và chỉ cần pull về và sử dụng với một số config mà bạn mong muốn
4 Kiến trúc của Docker:
Docker là một ứng dụng client-server, có 2 phiên bản phổ biến:
1 Docker Community Edition (CE): là phiên bản miễn phí và chủ yếu dựa vào cácsản phẩm nguồn mở khác
2 Docker Enterprise (EE): phiên bản dành cho các doanh nghiệp, khi sử dụng phiênbản này sẽ nhận được sự support của nhà phát hành, ngoài ra còn có thêm các tínhnăng quản lý và bảo mật
Trang 37Các thành phần của Docker Engine gồm có:
- Docker Deamon: chạy trên host, đóng vai trò là server, nhận các RESTful request
từ Docker Client và thực thi nó Là một lightweight runtime giúp build, run vàquản lý các containers và các thành phần liên quan khác
Docker Deamon quản lý 4 đối tượng chính: image, container, network, volume
- Docker Client (CLI): cung cấp giao diện dòng lệnh (command line) cho người sử
dụng, đồng thời cũng gửi request đến Docker deamon
Trang 38Tìm hiểu về Docker và Ruby On Rails
Sơ đồ minh họa các lệnh phổ biến của Docker client và mối quan hệ của Image,Container, Network, Volume
- Docker Registry: nơi lưu trữ Docker image Docker Hub là một registry công
khai mà bất cứ ai cũng có thể sử dụng và Docker được cấu hình để tìm kiếm imagetrên Docker Hub theo mặc định Bạn thậm chí có thể chạy registry riêng của mình
Có hai loại registry là public hoặc private registry
Trang 395 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.
$ docker images
5.1.2 Tải 1 image về hệ thống.
$ docker pull <image name>:<tag name>
Tải phiên bản mới nhất: $ docker pull <image name>:latest
5.1.3 Xóa 1 image ra khỏi hệ thống.
Có 2 cách:
Cách 1: sử dụng tên image
$ docker image rm <image name>:<tag name>
Cách 2: sử dụng id image
$ docker image rm <image id>
5.1.4 Lưu image thành file ở trên hệ thống máy host
$ docker save output <tên file muốn đặt>.tar <image name | image id> 5.1.5 Ép xóa image dù đang chạy 1 container
$ docker image rm <image name | image id> -f
5.1.6 Kiểm tra lịch sử hình thành nên image
$ docker image history <image name | image id>
5.1.7 Tra cứu thông tin của 1 image
$ docker inspect <image name | image id>:<image tag>
Trang 40Tìm hiểu về Docker và Ruby On Rails
* 2 tham số có thể viết gọn lại là : -it
5.2.3 Kiểm tra các container đang không chạy
$ docker ps -a
5.2.4 Khởi chạy 1 container đang dừng
$ docker start <container name | container id>
5.2.5 Truy cập vào container đang chạy
$ docker attach <container name | container id>
5.2.6 Ép dừng 1 container
$ docker stop <container name | container id>
5.2.7 Đặt tên và hostname cho container
$ docker run -it name “<container name>” -h <hostname> <image> 5.2.8 Xóa 1 container
$ docker rm <image>
5.2.9 Xóa container đang chạy
$ docker rm -f <image>