Tải bản đầy đủ (.docx) (49 trang)

TÌM HIỂU KUBERNETES TRIỂN KHAI MICROSERVICES với DOCKER

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 (2.23 MB, 49 trang )

ĐỒ ÁN MÔN HỌC

BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THỰC PHẨM TP.HCM
KHOA CÔNG NGHỆ THÔNG TIN


BÁO CÁO ĐỒ ÁN
ĐỀ TÀI : TÌM HIỂU KUBERNETES TRIỂN KHAI
MICROSERVICES VỚI DOCKER

Giảng viên hướng dẫn: Trần Thị Bích Vân
Sinh viên thực hiện:
1. Nguyễn Đăng Hiếu - 2033181023
2. Nguyễn Thành Dương - 2033181013

TP. HỒ CHÍ MINH – 2021
1


ĐỒ ÁN MÔN HỌC

LỜI CẢM ƠN
Tụi em xin chân thành gửi lời cảm ơn đến trường Đại Học Công Nghiệp Thực Phẩm
TP.Hồ Chí Minh, thầy cơ trong khoa Cơng Nghệ Thông Tin đã đào tạo, trau dồi, cung cấp
cho chúng em những kiến thức hữu ích để học tập và rèn luyện .
Xin cảm ơn Cơ Trần Thị Bích Vân đã hướng dẫn chúng em hoàn thành đồ án trong thời
gian vừa qua. Cô đã định hướng, hướng dẫn, truyền đạt lại những kiến thức rất bổ ích,
cũng như cung cấp những tài liệu cần thiết để em hoàn thành được đồ án
Cuối cùng, do chúng em chưa có nhiều kinh nghiệm cũng như hạn chế về mặt kiến thức
và trải nghiệm thức tế nên chắc chắn sẽ không tránh khỏi những sai sót trong đề tài này.


Chúng em mong nhận được sự phản hồi, đánh giá và đóng góp ý kiến của thầy để đề tài
của chúng em hoàn thiện hơn.
Chúng em xin chân thành cảm ơn!
Trân trọng!

2


ĐỒ ÁN MÔN HỌC

MỤC LỤC

DANH MỤC CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT
Viết tắt
K8s

Tiếng anh

Tiếng Việt

Kubernetes

tự động hoá việc quản lý, scaling và
triển khai ứng dụng dưới
dạng container

API

Application Programming Interface


một ứng dụng hay một thành
phần sẽ tương tác với một ứng
dụng hay thành phần khác.

REST

REpresentational State Transfer

là một dạng chuyển đổi cấu
trúc dữ liệu, một kiểu kiến trúc
để viết API

3


ĐỒ ÁN MÔN HỌC

CHƯƠNG 1: TỔNG QUAN
1.1. GIỚI THIỆU
– Hiện nay, nhiều ứng dụng đã thực hiện container hoá bằng cách sử dụng docker và

sử dụng nó như là mơi trường production ngày càng tăng. Trên môi trường
production, việc cấu trúc hệ thống chạy bằng container chỉ sử dụng docker là rất
khó khăn. Cho nên việc sử dụng một nền tảng Container orchestration engine như
là k8s thì khá phổ biến hiện nay.
– Tìm hiểu kubernetes
– Có 1 kịch bản, đó là lúc chúng ta phát triển ứng dụng trên môi trường và mục tiêu
cuối cùng là release sản phẩm, là chạy ứng dụng của mình trên mơi trường
production. Nhưng có vấn đề nảy sinh là mơi trường phát triển thì không được
giống với môi trường thử nghiệm và khác biệt với mơi trường production, khi đó

chúng ta khó gì đảm bảo rằng code chúng ta chạy mượt trên môi trường dev , trên
mơi trường testing và trên production ?
Vì thế Docker đã ra đời để giúp chúng ta giải quyết bài toán trên.
– Triển khai microservices với docker sẽ được tối ưu hóa mọi thứ. Nó khơng giống
như các máy ảo phải đầy đủ của một hệ điều hành khách. Việc riêng lẻ các
container được thực hiện ở cấp độ hạt nhân mà khơng cần hệ điều hành khách.
Ngồi ra, các thư viện có thể nằm trên các container. Giúp loại bỏ các bản sao của
một thư viện trên máy chủ, nhằm tiết kiệm không gian.

1.2. MỤC TIÊU VÀ PHẠM VI ĐỀ TÀI
– Hiểu và biết về Kubernetes .
– Triển khai được Microservices với Docker

4


ĐỒ ÁN MƠN HỌC

CHƯƠNG 2:TÌM HIỂU CHI TIẾT

2.1 TÌM HIỂU VỀ KUBERNETES

2.1.1 Kubernetes hoặc k8s
là một nền tảng mã nguồn mở tự động hoá việc quản lý, scaling và triển khai ứng dụng
dưới dạng container hay còn gọi là Container orchestration engine. Nó loại bỏ rất nhiều
các quy trình thủ công liên quan đến việc triển khai và mở rộng các containerized
applications.
Kubernetes orchestration cho phép bạn xây dựng các dịch vụ ứng dụng mở rộng nhiều
containers. Nó lên lịch các containers đó trên một cụm, mở rộng các containers và quản
lý tình trạng của các containers theo thời gian.

Các containers đó phải được triển khai trên nhiều server hosts. Kubernetes cung cấp khả
năng phối hợp và quản lý cần thiết để triển khai các containers theo quy mô cho các
workloads đó.
2.1.2 Nên sử dụng Kubernetes khi :


Các doanh nghiệp lớn, có nhu cầu thực sự phải scaling hệ thống nhanh chóng,
và đã sử dụng container (Docker).
5


ĐỒ ÁN MƠN HỌC


Các dự án cần chạy lớn hơn hoặc bằng 5 container cùng loại cho 1 dịch vụ.



Các startup tân tiến, chịu đầu tư vào công nghệ để dễ dàng auto scale về sau.

2.1.3 Kubernetes giải quyết các vấn đề :
Bằng việc sử dụng docker, trên 1 host bạn có thể tạo ra nhiều container. Tuy nhiên nếu
bạn có ý định sử dụng trên mơi trường production thì phải bắt buộc phải nghĩ đến những
vấn đề dưới đây:


Việc quản lý hàng loạt docker host




Container Scheduling



Rolling update



Scaling/Auto Scaling



Monitor vịng đời và tình trạng sống chết của container.



Self-hearing trong trường hợp có lỗi xãy ra. (Có khả năng phát hiện và tự
correct lỗi)



Service discovery



Load balancing



Quản lý data, work node, log




Infrastructure as Code



Sự liên kết và mở rộng với các hệ thống khác

Bằng việc sử dụng một Container orchestration engine như K8s có thể giải quyết được
nhưng vấn đề trên đây. Trong trường hợp khơng sử dụng k8s, Thì sẽ phải cần thiết tạo ra
cơ chế tự động hoá cho những cái kể trên, như thế thì cực kỳ tốn thời gian và khơng khả
thi.
K8s cũng có một chức năng tương tự như vậy đó là Service. Service của k8s cung cấp
chức năng load balancing cho hàng loạt các container được chỉ định. Việc tự động thêm,
xoá container thời điểm scale là điều hiển nhiên, khi một container xảy ra sự cố thì tự
động cách ly.
6


ĐỒ ÁN MƠN HỌC

K8s là một Platform nhưng có khả năng liên kết tốt với các hệ sinh thái bên ngồi, có
nhiều middleware chạy trên các service của k8s, trong tương lai chắc chắn sẽ cịn nhiều
hơn nữa.


Ansible: Deploy container tới Kubernetes




Apache Ignite: Sử dụng Service Discovery của Kubernetes, tự động tạo và
scaling k8s clkuster



Fluentd: gửi log của container trong Kubernetes



Jenkins: Deploy container đến Kubernetes



OpenStackCấu trúc k8s liên kết với Cloud



Prometheus: Monitor Kubernetes



Spark: Thực thi native job trên Kubernetes(thay thế cho YARN)

• SpinnakerDeploy container đến Kubernetes
K8s chuẩn bị một vài cơ chế để có thể mở rộng, thực thi chức năng độc lập, nó có thể sử
dụng platform như là một framework. Bằng cách sử dụng khả năng mở rộng, chúng ta có
thể thực hiện release một ReplicaSet mà k8s cung cấp.

2.1.4 Những khái niệm cơ bản trong Kubernetes

Master node
Là server điều khiển các máy Worker chạy ứng dụng. Master node bao gồm 4 thành phần
chính:


Kubernetes API Server: là thành phần giúp các thành phần khác liên lạc nói
chuyện với nhau. Lập trình viên khi triển khai ứng dụng sẽ gọi API Kubernetes
API Server này.



Scheduler: Thành phần này lập lịch triển khai cho các ứng dụng, ưng dụng
được đặt vào Worker nào để chạy



Controler Manager: Thành phần đảm nhiệm phần quản lý các Worker, kiểm tra
các Worker sống hay chết, đảm nhận việc nhân bản ứng dụng…
7


ĐỒ ÁN MƠN HỌC


Etcd: Đây là cơ sở dữ liệu của Kubernetes, tất cả các thông tin của Kubernetes
được lưu trữ cố định vào đây.

Worker node
Là server chạy ứng dụng trên đó. Bao gồm 3 thành phần chính:



Container runtime: Là thành phần giúp chạy các ứng dụng dưới dạng
Container. Thông thường người ta sử dụng Docker.



Kubelet: đây là thành phần giao tiếp với Kubernetes API Server, và cũng quản
lý các container



Kubernetes Service Proxy: Thành phần này đảm nhận việc phân tải giữa các
ứng dụng

Kubectl
Tool quản trị Kubernetes, được cài đặt trên các máy trạm, cho phép các lập trình viên đẩy
các ứng dụng mô tả triển khai vào cụm Kubernetes, cũng như là cho phép các quản trị
viên có thể quản trị được cụm Kubernetes.
Pod
Pod là khái niệm cơ bản và quan trọng nhất trên Kubernetes. Bản thân Pod có thể chứa 1
hoặc nhiều hơn 1 container. Pod chính là nơi ứng dụng được chạy trong đó. Pod là các
tiến trình nằm trên các Worker Node. Bản thân Pod có tài nguyên riêng về file system,
cpu, ram, volumes, địa chỉ network…
Image
Là phần mềm chạy ứng dụng đã được gói lại thành một chương trình để có thể chạy dưới
dạng container. Các Pod sẽ sử dụng các Image để chạy.
Các Image này thông thường quản lý ở một nơi lưu trữ tập trung, ví dụ chúng ta có
Docker Hub là nơi chứa Images của nhiều ứng dụng phổ biến như nginx, mysql,
wordpress…


8


ĐỒ ÁN MÔN HỌC

Deployment
Là cách thức để giúp triển khai, cập nhật, quản trị Pod.
Replicas Controller
Là thành phần quản trị bản sao của Pod, giúp nhân bản hoặc giảm số lượng Pod.
Service
Là phần mạng (network) của Kubernetes giúp cho các Pod gọi nhau ổn định hơn, hoặc để
Load Balancing giữa nhiều bản sao của Pod, và có thể dùng để dẫn traffic từ người dùng
vào ứng dụng (Pod), giúp người dùng có thể sử dụng được ứng dụng.
Label
Label ra đời để phân loại và quản lý Pod,. Ví dụ chúng ta có thể đánh nhãn các Pod chạy
ở theo chức năng frontend, backend, chạy ở môi trường dev, qc, uat, production…
2.1.5 Các tính năng của Kubernetes
-Phát hành và khơi phục tự động
Kubernetes sẽ tiến hành dần dần các thay đổi đối với ứng dụng hoặc cấu hình của ứng
dụng, đồng thời theo dõi tình trạng ứng dụng để đảm bảo nó khơng giết tất cả các phiên
bản của bạn cùng một lúc. Nếu có vấn đề gì xảy ra, Kubernetes sẽ hoàn trả thay đổi cho
bạn. Tận dụng hệ sinh thái các giải pháp triển khai đang phát triển.
-Khám phá dịch vụ cân bằng tải
Không cần phải sửa đổi ứng dụng của bạn để sử dụng một cơ chế khám phá dịch vụ
không quen thuộc. Kubernetes cung cấp cho các Pods địa chỉ IP của riêng họ và một tên
DNS duy nhất cho một nhóm các Pod và có thể cân bằng tải trên các nhóm đó.
-Điều phối lưu trữ

9



ĐỒ ÁN MÔN HỌC

Tự động gắn kết hệ thống lưu trữ mà bạn chọn, cho dù từ bộ nhớ cục bộ, nhà cung cấp
đám mây công cộng như GCP hoặc AWS , hay hệ thống lưu trữ mạng như NFS, iSCSI,
Gluster, Ceph, Cinder hoặc Flocker.
-Quản lý cấu hình và bí mật
Triển khai và cập nhật bí mật và cấu hình ứng dụng mà khơng cần xây dựng lại hình ảnh
của bạn và khơng để lộ bí mật trong cấu hình ngăn xếp của bạn.
-Đóng gói các thùng rác tự động
Tự động đặt các thùng chứa dựa trên các yêu cầu tài nguyên và các ràng buộc khác của
chúng, trong khi khơng làm mất tính khả dụng. Kết hợp khối lượng công việc quan trọng
và nỗ lực cao nhất để tăng hiệu quả sử dụng và tiết kiệm nhiều tài nguyên hơn nữa.
-Thực hiện hàng loạt
Kubernetes có thể quản lý khối lượng công việc theo lô và CI của bạn, thay thế các vùng
chứa bị lỗi, nếu muốn.
-Ngăn xếp kếp Ipv4 / Ipv6
-Phân bổ địa chỉ IPv4 và IPv6 cho các nhóm và dịch vụ
-Chia tỉ lệ ngang
-Mở rộng ứng dụng của bạn lên và xuống bằng một lệnh đơn giản, với giao diện người
dùng hoặc tự động dựa trên mức sử dụng CPU.
-Tự sửa chửa
-Khởi động lại các vùng chứa bị lỗi, thay thế và lên lịch lại vùng chứa khi các nút chết,
loại bỏ các vùng chứa không phản hồi với kiểm tra tình trạng do người dùng xác định và
không quảng cáo chúng cho khách hàng cho đến khi chúng sẵn sàng phân phát.
-Được thiết kế để có thể mở rộng
-Thêm các tính năng vào cụm Kubernetes của bạn mà khơng cần thay đổi mã nguồn
ngược dịng.
10



ĐỒ ÁN MƠN HỌC

2.2 TÌM HIỂU VỀ MICROSERVICES (kiến trúc nhiều dịch vụ nhỏ ):
Microservice là một kỹ thuật thuật phát triển phần mềm , một hướng của kiến trúc dịch
vụ (SOA) cấu trúc một ứng dụng như một tập hợp các dịch vụ được ghép lỏng lẻo. Trong
kiến trúc microservice, các dịch vụ được xử lý tốt và các giao thức rất nhẹ. Lợi ích của
việc phân tách một ứng dụng thành các dịch vụ nhỏ hơn là nó cải thiện tính mơ đun. Điều
này làm cho ứng dụng dễ hiểu hơn, phát triển, thử nghiệm và trở nên linh hoạt hơn đối
với xói mịn kiến trúc. Nó song song phát triển bằng cách cho phép các nhóm tự trị nhỏ
phát triển, triển khai và mở rộng quy mô dịch vụ tương ứng của họ một cách độc lập. Nó
cũng cho phép kiến trúc của một dịch vụ riêng lẻ xuất hiện thông qua tái cấu trúc liên tục.
Kiến trúc dựa trên microservice cho phép phân phối và triển khai liên tục.
Microservice là một kiếu kiến trúc phần mềm. Các module trong phần mềm này được
chia thành các service rất nhỏ (microservice). Mỗi service sẽ được đặt trên một server
riêng -> dễ dàng để nâng cấp và scale ( quy mô) ứng dụng.
2.2.1 Kiến trúc Microservices
Khác biệt với kiến trúc Monolith, hay vì gom tất cả module thành một khối (monolith), ta
tách các module thành những service siêu nhỏ. Mỗi service sẽ được đặt trên một server
riêng (Có thể dùng server cloud như AWS hoặc Azure), giao tiếp với nhau thông qua
mạng (Gửi nhận message qua giao thức HTTP hoặc sử dụng MessageQueue)...

Các đặc trưng của mơ hình Microservice
1. Micro-service
Đặc trưng này được thể hiện ngay từ tên của kiến trúc. Nó là microservice chứ khơng
phải là miniservice hay nanoservice. Thực tế khơng tồn tại mơ hình kiến trúc cho
miniservice hay nanoservice. Từ microservice được sử dụng để giúp người thiết kế có
cách tiếp cận đúng đắn. Một ứng dụng lớn cần được chia nhỏ ra thành nhiều thành phần,
các thành phần đó cần tách biệt về mặt dữ liệu (database) và phải đủ nhỏ cả về mặt kích
cỡ và độ ảnh hưởng của nó trong hệ thống, khi thêm một microservice vào hệ thống cũng

nên đảm bảo rằng nó đủ nhỏ để dễ dàng tháo gỡ, xóa bỏ khỏi hệ thống mà không ảnh
hưởng nhiều tới các thành phần khác.
Ví dụ: Facebook có các tính năng như đăng và hiển thị trạng thái, gửi tin nhắn, gợi ý kết
bạn, hiển thị quảng cáo. Mỗi tính năng này có thể được thiết kế như một microservice
hoặc có thể tiếp tục chia nhỏ các tính năng trên thành các microservice nếu thấy
microservice đó chưa đủ nhỏ và vẫn có thể tách biệt về mặt dữ liệu (tách biệt database).

11


ĐỒ ÁN MƠN HỌC

2. Tính độc lập
Các microservice hoạt động tách biệt nhau trong hệ thống, do vậy việc build một
microservice cũng độc lập với việc build các microservice khác. Thơng thường, để tiện
cho việc phát triển và duy trì các microservice, người phát triển nên viết các built script
khác nhau cho mỗi microservice.
Do tính tách biệt này mà mỗi microservice đều dễ dàng thay thế và mở rộng. Hơn thế
nữa, nó cịn giúp việc phát triển các microservice linh động hơn, các microservice có thể
được phát triển bởi các team khác nhau, dùng các ngôn ngữ khác nhau và tiến độ phát
triển dự án cũng nhanh hơn do không có sự phụ thuộc giữa các team, mỗi team có thể chủ
động quản lý phần việc riêng của mình.
3. Tính chuyên biệt
Mỗi microservice là một dịch vụ chuyên biệt, có thể hoạt động độc lập, thông thường mỗi
microservice đại diện cho một tính năng mà các cơng ty/ doanh nghiệp muốn cung cấp
tới người dùng, do vậy người thiết kế hệ thống microservice cần hiểu rõ về hoạt động
kinh doanh của công ty. Các đầu vào đầu ra và chức năng của mỗi microservice cần được
định nghĩa rõ ràng.
4. Phòng chống lỗi
Kiến trúc microservice sinh ra là để dành cho các hệ thống từ lớn đến vơ cùng lớn. Nó áp

dụng phương pháp chia để trị, phương pháp này giúp việc áp dụng các công cụ, kỹ thuật
cho việc giám sát,phòng chống lỗi phần mềm, lỗi hệ thống hiệu quả.
Khi một thành phần trong hệ thống bị lỗi, nó có thể được thay thế bằng các thành phần dự
phòng một cách dễ dàng, trong quá trình thay thế thành phần bị lỗi, các thành phần khác
vẫn hoạt động bình thường, do vậy hoạt động của toàn bộ hệ thống sẽ khơng hoặc ít bị
gián đoạn.

2.2.2 Các ưu điểm của Kiến trúc Microservices
Các ứng dụng lớn cần thiết được tách ra thành các service nhỏ. Mỗi service quản lý một
cơ sở dữ liệu riêng, nằm trên một server riêng, tách biệt hồn tồn với nhau. Các ưu điểm
như sau:


Điều quan trọng nhất là rất dễ nâng cấp và scale up, scale down. Giả sử bạn làm
một trang web liên quan tới vận tải, kho bãi. Khi số lượng xe hay hàng hóa tăng
lên, chỉ việc nâng cấp server cho service liên quan đến nghiệp vụ kho vận(ngược
lại, có thể giảm server nếu cần thiết). Với cloud computing, việc nâng cấp server
vô cùng dễ dàng chỉ với vài cú click chuột. Điều này rất khó thực hiện với
monolith.
12


ĐỒ ÁN MƠN HỌC


Do tách biệt nên nếu một service bị lỗi, tồn bộ hệ thống vẫn hoạt động bình
thường. Với monolith, một module bị lỗi có thể sẽ kéo sập tồn bộ hệ thống.




Các service nằm tách biệt nhau, chúng có thể được sử dụng các ngơn ngữ lập trình
riêng, database riêng. VD service xử lý ảnh có thể viết bằng C++, service tổng hợp
data có thể viết bằng Python.



Có thể áp dụng được các quy trình tự động hóa, như build, deploy, monitoring,...



Khi chia nhỏ các service, team size sẽ giảm và mọi người sẽ làm việc hiệu quả hơn

-

Giảm thiểu sự gia tăng phức tạp rối rắm hệ thống lớn.

-

Chia nhỏ ứng dụng một khối cồng kềnh thành các dịch vụ nhỏ dễ quản lý, bảo trì
nâng cấp, tự do chọn, nâng cấp công nghệ mới.

-

Mỗi dịch vụ nhỏ sẽ định ra ranh giới rõ ràng dưới dạng RPC hay API hướng thông
điệp.

-

Microservice thúc đẩy tách rạch ròi các khối chức năng (loose coupling - high
cohesion), điều rất khó thực hiện với ứng dụng một khối. Nếu muốn loose coupling

- high cohesion trong ứng dụng một khối, sẽ phải thiết kế theo Design Pattern
(Gang Of Four) và liên tục tái cấu trúc (refactor)

Mỗi dịch vụ nhỏ sẽ phát triển dễ hơn, nhanh hơn, dễ viết mã kiểm thử tự động.
2.2.3 Nhược điểm


Các module giao tiếp qua mạng nên có thể tốc độ khơng cao bằng monolith. Ngồi
ra, mỗi module phải tự giải quyết các vấn đề về bảo mật, transaction, lỗi kết nối,
quản lý log files.



Việc đảm bảo tính đồng nhất trong dữ liệu sẽ trở nên phức tạp hơn



Sử dụng nhiều service nên việc theo dõi, quản lý các service này sẽ phức tạp hơn



Cần một đội ngũ thật ngon để thiết kế và triển khai bao gồm software architect xịn



Microservice nhấn mạnh kích thước nhỏ gọn của dịch vụ. Một số lập trình đề xuất
dịch vụ siêu nhỏ cỡ dưới 100 dòng code. Chia quá nhiều sẽ dẫn đến manh mún,
vụn vặt, khó kiểm sốt. Việc lưu dữ liệu cục bộ bên trong những dịch vụ quá nhỏ sẽ
khiến dữ liệu phân tán quá mức cần thiết.
13



ĐỒ ÁN MƠN HỌC


Nhược điểm tiếp của microservice đến từ đặc điểm hệ thống phân tán (distributed
system):
1 - Phải xử lý sự cố khi kết nối chậm, lỗi khi thông điệp khơng gửi được hoặc
thơng điệp gửi đến nhiều đích đến vào các thời điểm khác nhau.
2 - Đảm bảo giao dịch phân tán (distributed transaction) cập nhật dữ liệu đúng đắn
(all or none) vào nhiều dịch vụ nhỏ khác nhau khó hơn rất nhiều, đơi khi là khơng
thể so với đảm bảo giao dịch cập nhật vào nhiều bảng trong một cơ sở dữ liệu trung
tâm.
3 - Theo nguyên tắc CAP (CAP theorem) thì giao dịch phân tán sẽ không thể thỏa
mãn cả 3 điều kiện: consistency (dữ liệu ở điểm khác nhau trong mạng phải giống
nhau), availablity (yêu cầu gửi đi phải có phúc đáp), partition tolerance (hệ thống
vẫn hoạt động được ngay cả khi mạng bị lỗi).
4 - Kiểm thử tự động một dịch vụ trong kiến trúc microservices đôi khi yêu cầu
phải chạy cả các dịch vụ nhỏ khác mà nó phụ thuộc. Do đó khi phân rã ứng dụng
một khối thành microservices cần luôn kiểm tra mức độ ràng buộc giữa các dịch vụ
mềm dẻo hơn hay cứng nhắc - lệ thuộc hơn. Nếu ràng buộc ít đi, lỏng leo hơn, bạn
đi đúng hướng và ngược lại.

2.3 TÌM HIỂU VỀ DOCKER

2.3.1 Docker là gì?
Docker là một công cụ được thiết kế để giúp tạo, triển khai và chạy các ứng dụng dễ
dàng hơn bằng cách sử dụng các containers.
Docker là nền tảng phần mềm cho phép bạn 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

14


ĐỒ ÁN MƠN HỌC

là container có mọi thứ mà phần mềm cần để chạy, trong đó có thư viện, cơng cụ hệ
thống, mã và thời gian chạy. Bằng cách sử dụng Docker, bạn có thể nhanh chóng triển
khai và thay đổi quy mô ứng dụng vào bất kỳ môi trường nào và biết chắc rằng mã của
bạn sẽ chạy được.
Docker là một nền tảng cho phép bạn build, ship và chạy các container dựa trên nhân của
Linux. Docker hỗ trợ một cách mặc định cho các nền tảng Linux.
Điểm khác biệt là thay vì tạo ra tồn bộ hệ điều hành ảo, Docker cho phép các ứng dụng
sử dụng cùng một nhân Linux như hệ thống mà chúng đang chạy và chỉ yêu cầu các ứng
dụng được vận chuyển với những thứ chưa chạy trên máy chủ. Điều này giúp tăng hiệu
suất đáng kể và giảm kích thước của ứng dụng và quan trọng, Docker là mã nguồn mở.
2.3.2 Nền tảng Docker
Docker cung cấp khả năng đóng gói và chạy một ứng dụng trong một môi trường cô lập
lỏng lẻo được gọi là vùng chứa. Sự cô lập và bảo mật cho phép bạn chạy nhiều vùng chứa
đồng thời trên một máy chủ nhất định. Các vùng chứa có trọng lượng nhẹ và chứa mọi
thứ cần thiết để chạy ứng dụng, vì vậy bạn khơng cần phải dựa vào những gì hiện được
cài đặt trên máy chủ lưu trữ. Bạn có thể dễ dàng chia sẻ vùng chứa trong khi làm việc và
đảm bảo rằng mọi người bạn chia sẻ đều có cùng vùng chứa hoạt động theo cùng một
cách.

Docker cung cấp công cụ và nền tảng để quản lý vịng đời của các vùng chứa của bạn:


Phát triển ứng dụng của bạn và các thành phần hỗ trợ của nó bằng cách sử dụng
các thùng chứa.




Vùng chứa trở thành đơn vị phân phối và thử nghiệm ứng dụng của bạn.



Khi bạn đã sẵn sàng, hãy triển khai ứng dụng của bạn vào môi trường sản xuất của
bạn, dưới dạng một vùng chứa hoặc một dịch vụ được điều phối. Điều này hoạt
động giống nhau cho dù môi trường sản xuất của bạn là trung tâm dữ liệu cục bộ,
nhà cung cấp đám mây hay kết hợp cả hai.

2.3.3 Containers
Container giải quyết vấn đề quan trọng trong việc phát triển ứng dụng. Khi viết code, các
dev làm việc trên môi trường của riêng họ. Nhưng khi chuyển sang môi trường hệ thống
thực tế production, vấn đề nảy sinh. Code hoạt động tốt trên máy của dev nhưng lại
không hoạt động trong mơi trường thực tế. Có nhiều ngun nhân như: hệ điều hành khác
nhau, phụ thuộc khác nhau, thư viện khác nhau.
15


ĐỒ ÁN MÔN HỌC

Các container giải quyết vấn đề về tính di động và cho phép tách code ra khỏi cơ sở hạ
tầng bên dưới mà nó đang chạy. Các dev có thể đóng gói ứng dụng của họ. Bao gồm tất
cả các thùng và thư viện mà nó cần để chạy chính xác, vào một ảnh container nhỏ. Trong
production, container có thể chạy trên bất kỳ máy tính nào có nền tảng hợp nhất.
Ưu điểm của Container
Ngồi việc giải quyết thách thức về tính di động, container cịn cung cấp nhiều lợi thế so
với cơng nghệ ảo hóa truyền thống.
Container chỉ để lại dấu chân cực kỳ nhỏ. Chỉ cần ứng dụng của nó và các thùng, thư viện

mà nó u cầu để chạy. Khơng giống như các máy ảo có một bản sao hồn chỉnh của một
hệ điều hành khách. Việc cách ly container được thực hiện ở cấp độ hạt nhân mà không
cần hệ điều hành khách. Ngồi ra, các thư viện có thể nằm trên các container. Giúp loại
bỏ việc phải có 10 bản sao của một thư viện trên máy chủ, nhằm tiết kiệm không gian.
Nếu có 3 ứng dụng chạy các node và express thì khơng cần phải có 3 instance node và
express. Những ứng dụng đó có thể chia sẻ các thùng và thư viện đó. Cho phép các ứng
dụng được đóng gói trong các mơi trường khép kín cho phép triển khai nhanh hơn.
Tương đương gần hơn giữa các môi trường phát triển và khả năng mở rộng vô hạn.
Những ưu điểm của docker
1 .Dưới máy local – giả lập môi trường server
Giả sử một máy bình thường trong mơi trường server, khi chạy demo cho một dự án thì
khá tốt. Nhưng khả năng sập khi deploy thì khả năng xảy ra khá cao. Nguyên nhân do
khác môi trường, máy local và server ở 2 môi trường khác nhau. Và đây là cơ bản dẫn
đến liên quan.
Thế nhưng, bạn có thể thu phục mơi trường server một cách hồn hảo với máy local – chỉ
nhờ docker.
2. Dùng một hệ điều hành mới và trải nghiệm
Chỉ cần docker là đủ, chẳng cần đến virtua studio nữa.
3. Chia sẻ và lưu trữ – setup dự án cho nhóm
Trước đây, để setup dự án rất là lằng nhằng, khi có docker thì chỉ cần một hành động
share container thì đã hiệu quả rồi. Bạn sẽ giảm được hơn 1/2 những document cho việc
setup cho môi trường.
Thuận tiện, đơn giản và dễ dàng cho các thành viên của hệ thống khi tham gí vào dự án.

16


ĐỒ ÁN MƠN HỌC

4. Chương trình test song song

Docker sinh ra nhiều container gần giống nhau, rồi ta chia task cho nó cùng thực hiện
một lúc. Liên tục vận dụng hết các tài nguyên server sẵn có để test.
5.Test app với hệ điều hành khác
Có nghĩa là bạn có thể dùng docker để chạy thử app của một chương trình khác mà không
cần setup máy ảo lại.
2.3.4 Cách thức hoạt động của Docker
Docker hoạt động bằng cách cung cấp phương thức tiêu chuẩn để chạy mã của bạn.
Docker là hệ điều hành dành cho container. Cũng tương tự như cách máy ảo ảo hóa (loại
bỏ nhu cầu quản lý trực tiếp) phần cứng máy chủ, các container sẽ ảo hóa hệ điều hành
của máy chủ. Docker được cài đặt trên từng máy chủ và cung cấp các lệnh đơn giản mà
bạn có thể sử dụng để dựng, khởi động hoặc dừng container.
2.3.5 Lý do nên sử dụng Docker
Việc sử dụng Docker cho phép bạn vận chuyển mã nhanh hơn, tiêu chuẩn hóa hoạt động
của ứng dụng, di chuyển mã một cách trơn tru và tiết kiệm tiền bằng cách cải thiện khả
năng tận dụng tài nguyên. Với Docker, bạn sẽ được nhận một đối tượng duy nhất có khả
năng chạy ổn định ở bất kỳ đâu. Cú pháp đơn giản và không phức tạp của Docker sẽ cho
bạn quyền kiểm sốt hồn tồn. Việc đưa vào áp dụng rộng rãi nền tảng này đã tạo ra một
hệ sinh thái bền vững các cơng cụ và ứng dụng có thể sử dụng ngay đã sẵn sàng sử dụng
với Docker.

Kiến trúc của Docker

17


ĐỒ ÁN MÔN HỌC

2.3.6 Các thành phần trong Docker
1. The Docker daemon
Một docker daemon là một thành phần server chạy trên một máy ảo và được ví như một

server chịu trách nhiệm build, chạy và phân phối các Docker container. Docker client
tương tác với daemon này thông quá Rest API.
2. The Docker client
Docker client là một CLI cho phép tương tác với Docker daemon thông qua socket hoặc
Rest API. Docker client có thể được chạy trên cùng một host với daemon hoặc chạy trên
một host khác và kết nối với daemon bằng cách dùng CLI.
3. The Docker image
Khái niệm quan trọng nhất về Docker chính là Docker image. Nó là một bản sao cho các
thư viện hệ điều hành cũng như các ứng dụng liên quan trong OS đó. Trong ngữ cảnh
microservices mà được xây dựng trên nên tảng Spring Boot, Docker image có thể được
gói trong một distribution của Linux như Alpine, JRE8 và một Spring Boot microservice
jar.

18


ĐỒ ÁN MÔN HỌC

4. The Docker container
Cách hiểu đơn giản nó là các instance của Docker image. Docker container sẽ sử dụng
kernel của hệ điều hành Linux và nó sẽ có hệ thống filesystem của nó cũng như các cấu
hình network.
5. Dockerfile
Là một file chứa các script có nhiệm vụ chỉ dẫn ra việc build như thế nào đối với một
Docker image. Về cơ bản nó là một file văn bản (text file) và có tên là Dockerfile.

CHƯƠNG 3:XÂY DỰNG MƠ HÌNH
3.1. GIỚI THIỆU MƠ HÌNH
Bắt đầu triển khải container cho Docker theo các bước dưới đây:
1. Cài đặt Docker

Để triển khai microservices bởi Docker, các bạn phải cài đặt Docker từ
(www.docker.com) và làm theo các chỉ dẫn được đưa ra khi cài đặt.
2. Chuẩn bị Dockerfile
Giả sử rằng bạn đang thiết kế các service dùng Spring Boot và nói chuyện thơng qua
RabbitMQ. Khi đó bạn cần thay đổi lại application. Properties là nơi khai báo các cấu
hình liên quan kết nối rabbitmq bằng cách dùng địa chỉ IP thay cho dùng localhost. Tại
sao lại vây, bởi vì localhost khơng thể định danh bên trong các Docker container. Trong
ứng dụng thực, cái này sẽ được trỏ bởi DNS hoặc qua load balancer.
Tạo một file docker (tên file là Dockerfile) và đưa vào thư mục gốc chứa mã nguồn
microservice bạn sẽ phát triển. File này về cơ bản sẽ là:
3. Build Docker
Xong xi phần khai báo, giờ để build chúng (có nghĩa là download JDK8 image và thực
hiện các lệnh trong Dockerfile), cách đơn giản là chạy lệnh docker build tại thư mục chứa
Dockerfile.

19


ĐỒ ÁN MƠN HỌC

Ở đây chúng ta sẽ có 2 microservices là reservation và customer. Lặp lại bước 2->3 cho
microservice customer.
4. Thực hiện chạy (run) một Docker container
Cuối cùng chúng sẽ thực hiện chạy một Docker container bằng lệnh docker run. Lệnh này
sẽ load container và thực hiện chạy file jar mà bạn đã khai báo trong Dockerfile.
Để kiểm tra tất cả các services được start hay chưa
5. Run RabbitMQ
Như các bạn biết, RabbitMQ được sử dụng rất nhiều trong kiến trúc microservice. Vì vậy,
để setup RabbitMQ nhưng là một Docker container, cách dễ dàng nhất là lấy một image
đã có sẵn trên Docker Hub. Vậy là bạn có thể dễ dàng dùng rabbitmq để nói chuyện giữa

các microservices.
6. Docker Registry
Docker Hub là nới lưu trữ các Docker image. Tuy nhiên, các image có thể được lưu trữ
trong một private hub (local hub) vì lý do bảo mật. Chúng ta có thể làm điều này dễ dàng
với Docker bằng cách đăng ký một Docker Registry cho riêng bạn.
Tạo một private registry với cổng 3000:

$ DOCKER RUN -D -P 3000:3000 –RESTART=ALWAYS –NAME REGISTRY
REGISTRY:LATEST
Tạo tag:

$ DOCKER TAG RESERVATION:1.0 LOCALHOST:3000/RESERVATION:1.0
Cuối cùng là đẩy image bạn muốn lên registry.

$ DOCKER PUSH LOCALHOST:3000/RESERVATION:1.0
Đường link vào trang chủ docker để tải docker về máy
20


ĐỒ ÁN MÔN HỌC

/>
Các phiên bản của docker dành cho từng hệ điều hành

** cài đặt Docker **
Phiên bản Window
Biểu tượng giao diện docker

21



ĐỒ ÁN MÔN HỌC

22


ĐỒ ÁN MƠN HỌC

Phiên bản ubutu

3.2 NÊU Ý TƯỞNG
Mơ hình triển khai
Order-service

CLIENT

API-gateway

registry

RESTful - API Rule( filewall)

23

User-Service


ĐỒ ÁN MƠN HỌC

Giải thích sơ lượt về demo

- Tao ra 2 cái service đó là order-service và user-service
- Sử dụng kong getway để cung cấp api cho 2 service với bên ngoài
- Dùng registry để tao kết nối 2 service lại với nhau

Viết trên asp.net , html
RESTful API là một tieu chuẩn dùng trong việc thiết kế các API cho các ứng dụng web .
API (Application Programming Interface) là một tập các quy tắc và cơ chế mà theo đó,
một ứng dụng hay một thành phần sẽ tương tác với một ứng dụng hay thành phần khác.
API có thể trả về dữ liệu mà bạn cần cho ứng dụng của mình ở những kiểu dữ liệu phổ
biến như JSON hay XML.
REST (REpresentational State Transfer) là một dạng chuyển đổi cấu trúc dữ liệu, một
kiểu kiến trúc để viết API. Nó sử dụng phương thức HTTP đơn giản để tạo cho giao tiếp
giữa các máy. Vì vậy, thay vì sử dụng một URL cho việc xử lý một số thông tin người
dùng, REST gửi một yêu cầu HTTP như GET, POST, DELETE, vv đến một URL để xử
lý dữ liệu.

REST hoạt động chủ yếu dựa vào giao thức HTTP. Các hoạt động cơ bản nêu trên sẽ sử
dụng những phương thức HTTP riêng.


GET (SELECT): Trả về một Resource hoặc một danh sách Resource.



POST (CREATE): Tạo mới một Resource.



PUT (UPDATE): Cập nhật thơng tin cho Resource.




DELETE (DELETE): Xố một Resource.

Postman là một chương trình giúp bạn đóng vai 1 client để tạo restquest đến server,
postman như một trình duyệt dành cho web dev. Nó hỗ trợ đầy đủ các method http như
post, get, put, delete….và các tham số trong http request

*Push lên Docker
24


ĐỒ ÁN MÔN HỌC

*Kết quả thử nghiệm

25


×