You are on page 1of 43

Docker and

Containers
Phần 1: Khái quát về Docker
1. Docker là gì?
2. Container trong Docker là gì ?
3. Tại sao Docker lại phát triển, phổ biến nhanh chóng?
4. Thành phần của hệ thống sử dụng Docker?
5. Quy trình thực thi của 1 hệ thống Docker?
6. Cách thức hoạt động của Docker?
7. Khi nào cần sử dụng Docker?
Docker là gì?

Docker là 1 nền tảng để cung cấp cách


để building, deploying và running ứng
dụng dễ dàng hơn bằng cách sử dụng
các container (trên nền tảng ảo hóa).
Ban đầu viết bằng Python, hiện tại đã
chuyển sang Golang
Container trong docker là gì?

• Các containers cho phép lập trình viên đóng gói một ứng dụng với tất cả
các phần cần thiết, chẳng hạn như thư viện và các phụ thuộc khác, và gói
tất cả ra dưới dạng một package.
• Bằng cách đó, nhờ vào container, ứng dụng sẽ chạy trên mọi máy Linux
khác bất kể mọi cài đặt tùy chỉnh mà máy có thể có khác với máy được sử
dụng để viết code.
Tại sao Docker lại phát triển, phổ biến nhanh chóng?

• Tính dễ ứng dụng: Docker rất dễ cho mọi người sử dụng từ lập trình viên, sys admin…

nó tận dụng lợi thế của container để build, test nhanh chóng. Có thể đóng gói ứng dụng

trên laptop của họ và chạy trên public cloud, private cloud… Câu thần chú là “Build

once, run anywhere”.


Tại sao Docker lại phát triển, phổ biến nhanh chóng?

• Tốc độ: Docker container rất nhẹ và nhanh, bạn có thể tạo và chạy docker container trong vài
giây.
Tại sao Docker lại phát triển, phổ biến nhanh chóng?

• Môi trường chạy và khả năng mở rộng: Bạn có thể chia nhỏ những chức năng của
ứng dụng thành các container riêng lẻ. Ví dụng Database chạy trên một container và
Redis cache có thể chạy trên một container khác trong khi ứng dụng Node.js lại chạy
trên một cái khác nữa. Với Docker, rất dễ để liên kết các container với nhau để tạo
thành một ứng dụng, làm cho nó dễ dàng scale, update các thành phần độc lập với
nhau.
Thành phần của hệ thống sử dụng Docker ?

• Docker Engine : là thành phần chính của Docker,


như một công cụ để đóng gói ứng dụng

• Docker Hub : là một “github for docker images”.


Trên DockerHub có hàng ngàn public 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.
Thành phần của hệ thống sử dụng Docker ?

•Images: là một khuôn mẫu để tạo một 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. Ví dụ bạn build 1 image dựa
trên image Centos mẫu có sẵn để chạy Nginx và
những tùy chỉnh, cấu hình để ứng dụng web của bạn
có thể chạy được. Bạn có thể tự build một image riêng
cho mình hoặc sử dụng những image được chia sẽ từ
cộng đồng Docker Hub. Một image sẽ được build dựa
trên những chỉ dẫn của Dockerfile.
Thành phần của hệ thống sử dụng Docker ?

• Container: là một instance của một image. Bạn có


thể create, start, stop, move or delete container dựa
trên Docker API hoặc Docker CLI.

• Docker Daemon: lắng nghe các yêu cầu từ Docker


Client để quản lý các đối tượng như Container,
Image, Network và Volumes thông qua REST API.
Các Docker Daemon cũng giao tiếp với nhau để
quản lý các Docker Service.
Thành phần của hệ thống sử dụng Docker ?

• Docker Client: là một công cụ giúp người dùng


giao tiếp với Docker host.
• Dockerfile: là một tập tin bao gồm các chỉ dẫn để
build một image .
• Volumes: là phần dữ liệu được tạo ra khi container
được khởi tạo.
Quy trình thực thi của 1 hệ thống Docker ?

Quy trình thực thi của 1 hệ thống Docker


Quy trình thực thi của 1 hệ thống Docker ?
Một hệ thống Docker được thực thi với 3 bước chính:
• Build: Đầu tiên tạo một dockerfile, trong dockerfile này chính là code của chúng ta. Dockerfile
này sẽ được Build tại một máy tính đã cài đặt Docker Engine. Sau khi build ta sẽ có được
Container, trong Container này chứa ứng dụng kèm bộ thư viện của chúng ta.

• PushSau: Khi có được Container, chúng ta thực hiện push Container này lên cloud và lưu tại đó.

• Pull, Run: Nếu một máy tính khác muốn sử dụng Container chúng ta thì bắt buộc máy phải thực
hiện việc Pull container này về máy, tất nhiên máy này cũng phải cài Docker Engine. Sau đó
thực hiện Run Container này.
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.
Khi nào cần sử dụng Docker ?

• Triển khai kiến trúc microservices.


• Khi xây dựng ứng dụng và cần scale một cách linh hoạt.
• Khi bạn muốn không tốn khá nhiều thời gian để config máy local và server cùng một môi
trường để chạy được ứng dụng. Bạn chỉ cần build 1 lần chạy ở nhiều nơi mà thôi.
• Sản phẩm của công ty bạn cần một cách tiếp cận mới về xây dựng, đẩy lên server, thực thi ứng
dụng một cách nhanh chóng dễ dàng.
DOCKER
CONTAINER
Phần 2: Dockter Container.

1 . D o c k e r c o n ta in e r là g ì ?
2 . Ch ứ c n ă n g c ủ a co nt a in e r ?
3 . S ự k há c b iệ t g iữ a c o n ta in e r v à m á y ả o .
4 . Lý do mô hình docker phù hợp cho các ứng dụng cloud?
Docker container là gì?

Từ c o n ta in e r c ó n g h ĩa l à th ù n g đ ự n g , th ù n g c hứ a , v à c o n ta in e r tr o n g b à i v i ế t
n à y c ũ n g c ó ý n g h ĩa tư ơn g t ự n hư v ậ y.

G i ả sử t ôi c ó  m ột x ư ở n g s ả n x u ấ t c á c m ặ t h à n g tiê u d ù n g n h ư b án h k ẹo , th ạ c h
h o a q u ả , m ứ t tế t, ke m đ á n h r ăn g , b à n c h ả i đ á nh r ă n g , c h ỉ n h a k h o a . .. c á c m ặt
h à n g n à y k há c nh a u về m ục đ íc h s ử d ụ n g , là c á c s ả n p h ẩ m r iê n g b iệ t m à t ôi
m o n g m u ố n c u n g c ấ p đế n n gư ời m u a h à n g , d o v ậ y tô i c ầ n đ ó n g g ó i ch ú n g v à o
c á c tú i đ ự n g h a y th ù ng c h ứ a r iê n g b i ệt đ ể là m c ác m ụ c đ í c h c h ín h s a u :
Cung cấp lớp bảo vệ.

- Bảo vệ hàng hóa khỏi các điều kiện môi trường khác nhau như ánh sáng, độ ẩm và
nhiệt độ.
- Bảo vệ khỏi sự phá hoại từ các loài vi sinh vật.
- Bảo vệ hàng hóa khỏi rơi vỡ, dập nát.
Phòng tránh mất mát

- Bảo vệ ứng dụng khỏi tác động của các môi trường khác nhau như hệ điều hành hay
các thiết lập trên máy chạy ứng dụng đó.
- Bảo vệ khỏi sự xung đột với các ứng dụng khác chạy trên cùng một máy chủ.
Phòng tránh mất mát

Giải quyết một vấn đề nhức đầu của rất nhiều lập trình viên đó là ứng dụng chỉ chạy trên
máy của dev mà không chạy trên môi trường thật hay trên máy của QA, bằng cách đóng gói
ứng dụng bao gồm cả mã nguồn, các thiết lập và các gói thư viện, phần mềm phụ trợ của nó
theo đúng phiên bản.

Container sinh ra để đáp ứng những điều trên


Các ứng dụng chạy trong các container khác nhau, các
container này chạy trên nền docker engine.
Các chức năng của Docker Container.
• Tiêu chuẩn: Docker tao ra những tiêu chuẩn cho các container để chúng có thể mang đi và chạy
ở mọi nơi (portable).

• Lightweight: Các container dùng chung kernel với máy chủ do vậy các ứng dụng trong mỗi
container không đòi hỏi một hệ điều hành riêng, qua đó tăng hiệu quả sử dụng server, tiêu tốn ít
tài nguyên phần cứng hơn nên giảm được số lượng server và giảm giá thành của việc mua
license cho các server.

• Secure: Docker cung cấp khả năng cô lập mạnh mẽ giữa các ứng dụng chạy bên trong và ngoài
docker container, do vậy giúp các ứng dụng an toàn hơn khi chạy bên trong các container.

• Sự khác biệt giữa container và máy chủ áo sever


Sự khác biệt giữa Container và Máy ảo.

• Cả hai đều phục vụ được mục đích của bạn. Chúng đều cung cấp sự cô lập và sự
phân chia tài nguyên một cách hiệu quả. Vậy đâu là sự khác nhau giữa chúng? Hãy
cùng xem xét trường hợp sau.
• Khi ta phát triển một ứng dụng cho windows nhưng lại đang sử dụng ubuntu, lúc
này bạn có thể cài lại hệ điều hành windows cho máy của mình hoặc cài một máy
ảo windows, nhưng trong trường hợp này bạn không thể chạy một container
windows trên máy đang chạy ubuntu
Sự khác nhau giữa container và máy ảo
Container Virtual Machine
Tài nguyên Process trong container sử dụng trực tiếp tài nguyên Mọi thứ đều bị giới hạn bởi phần cứng ảo
(resource)
thật, nhưng HĐH có thể quy định mỗi process một mức
giới hạn tài nguyên khác nhau (hoặc không giới hạn).

Thực thi HĐH thật chạy phần mềm.


HĐH thật → HĐH ảo → HĐH ảo chạy phần mềm.
(execution)
(Đối với VPS, Hypervisor type 1 thay thế cho HĐH
thật)

Sự tối ưu Phần mềm thật chạy trên phần cứng thật. Tốc độ khởi Phần cứng thật phải gánh cả một HĐH ảo. Từ khi
(performance)
động gần như một phần mềm bình thường. máy tính khởi động lên, cho tới khi sử dụng được
phần mềm rất mất thời gian.
Container Virtual Machine
Tính bảo mật Process trong cùng container vẫn có thể ảnh hưởng tới nhau. Phần mềm có mã độc có thể ảnh hưởng tới
(Security)
Nhưng thông thường mỗi container chỉ nên chạy một process. tài nguyên của process khác trong cùng
Process khác container không thể gây ảnh hưởng cho nhau. VM.

Phần mềm hỗ trợ Docker Engine, LXC Linux Container, Apache Mesos, CRI-O VirtualBox, VMWare, Microsoft Hyper-V,
(Kubernetes)… Parallels, Linux KVM, Docker Machine…

Ứng dụng thực tế Triển khai service Back-end trên máy chủ, các phần mềm phải Dịch vụ máy chủ ảo (Virtual Private
thuộc cùng hệ điều hành. Server – VPS); Chạy phần mềm thuộc
những hệ điều hành khác nhau.
Container và ứng dụng trong kiến trúc microservice.

• Cùng xem mô hình kiến trúc microservice


Lý do sử dụng kiến trúc Microservice cho ứng dụng
Docker?
Kiến trúc microservices được tạo ra nhằm giải quyết các vấn đề mà chúng ta nhìn thấy trong cấu trúc nguyên
khối. Microservices đã được sử dụng rộng rãi và các websites quy mô lớn đã chuyển đổi từ các app nguyên
khối thành microservices. Một số lợi ích của việc dùng kiến trúc microservices:

• Developers sẽ làm việc trên một code base nhỏ hơn khi được so sánh với app nguyên khối. Khi các
components của app được kết hợp một cách rời rạt, cách developers sẽ dễ dàng hiểu source code và không
làm chậm quá trình phát trình phát triển. Không thể không đề cập, IDE của bạn sẽ nhanh hơn nếu bạn làm
việc với số dòng code ít hơn. Các developers sẽ không cần đối đầu với sự phức tạp và sự phụ thuộc của
các functions mà có thể được tìm thấy trong một app nguyên khối.
Lý do sử dụng kiến trúc Microservice cho ứng dụng
Docker?
• Các khối công nghệ của app có thể đa dạng ở các microservices. Ứng dụng sẽ không còn cần phụ thuộc vào
một ngôn ngữ hay thư viện nhất định. Microservices sẽ có thể cho phép các ngôn ngữ lập trình khác nháu mà
các developers thấy phù hợp.

• Dễ dàng update hệ thống khi có thay đổi nhỏ. So sánh với monolithic app, với microservices, bạn sẽ không cần
deploy mọi thứ trở lại cho một sự thay đổi nhỏ, thay vào đó chỉ cần rebuild và deploy cái microservice mà bạn
cần update.

• Khả năng mở rộng sẽ độc lập đối với mỗi microservice. Bạn có thể chọn để mở rộng mỗi compenent dựa vào
nguồn mà nó cần. Bạn sẽ không cần tạo nhiều instances của mọi thứ như app nguyên khối. Việc mở rộng các
microservices sẽ dùng một cách hiệu quả các nguồn có sắn thay vì tạo nhiều bản copy của toàn bộ hệ thống
trong một app nguyên khối.
Lý do sử dụng kiến trúc Microservice cho ứng dụng
Docker?
• Dữ liệu có thể phi tập trung. Bạn có thể chọn dùng các databases hay storage khác nhau. Bạn có thể chọn
NoQuery database nếu microservice của bạn phù hợp với nó hơn relational database. Một microservice
cũng có thể chỉ cần một database được lưu trữ theo key đơn giản như Redis. Giống như sơ đồ bên dưới,
bạn có thể chọn sự kết hợp giữa Cloudant, MySQL và MongoDB. Bạn có thể tận dụng các cơ sở dữ liệu
khác nhau để lưu trữ các loại dữ liệu khác nhau.

• Isolate failures. Một eror hoặc một bug trong một microservice không làm down toàn bộ hệ thống. Khi
bạn có các thành phần được kết hợp một cách rời rạt và một dịch vụ microservice trong ứng dụng của bạn
bị treo hoặc ném lỗi thì ít có khả năng các microservices khác bị ảnh hưởng vì chúng nằm trong các
containers riêng và không hoàn toàn phụ thuộc vào nhau. Một ứng dụng nguyên khối có thể làm down
toàn bộ quá trình ứng dụng của bạn nếu error hoặc bug không được phát hiện một cách toàn diện.
Các container đóng vai trò quan trọng trong việc triển
khai hệ thống microservice vì:
• Dễ tạo, dễ hủy.

• Khởi động nhanh.

• Container có khả năng dừng nhanh chóng.

• Nhẹ (Lightweight).

• Portable.

• Đồng nhất.
Lý do mô hình Docker phù hợp cho các ứng dụng
Cloud
• Cải thiện – và liền mạch – tính di động: Trong khi vùng chứa LXC thường tham chiếu đến các cấu hình
máy cụ thể; thì vùng chứa Docker chạy mà không cần sửa đổi trên bất kỳ máy tính để bàn, trung tâm dữ
liệu và môi trường đám mây nào

• Trọng lượng nhẹ hơn và cập nhật chi tiết hơn: Với LXC, nhiều quy trình có thể được kết hợp trong một
thùng chứa duy nhất. Với vùng chứa Docker, chỉ một quy trình có thể chạy trong mỗi vùng chứa. Điều này
giúp bạn có thể xây dựng một ứng dụng có thể tiếp tục chạy trong khi một trong các phần của nó bị gỡ
xuống để cập nhật hoặc sửa chữa.

• Tạo vùng chứa tự động: Docker có thể tự động tạo vùng chứa dựa trên mã nguồn ứng dụng.
Lý do mô hình Docker phù hợp cho các ứng dụng
Cloud
• Lập phiên bản vùng chứa: Docker có thể theo dõi các phiên bản của hình ảnh vùng chứa; quay trở lại các
phiên bản trước và theo dõi ai đã tạo phiên bản và cách thức. Nó thậm chí có thể chỉ tải lên các delta giữa
phiên bản hiện có và phiên bản mới.

• Tái sử dụng vùng chứa: Các vùng chứa hiện có có thể được sử dụng làm hình ảnh cơ sở; về cơ bản giống
như các mẫu để xây dựng vùng chứa mới.

• Thư viện vùng chứa được chia sẻ: Các nhà phát triển có thể truy cập sổ đăng ký mã nguồn mở chứa hàng
nghìn vùng chứa do người dùng đóng góp.
THAO TÁC
VỚI DOCKER
CONTAINER
Phần 3 : Thao tác với docker container
• 1. Cài đặt docker
• 2. Các câu lệnh thường dùng với docker
Cài đặt docker
• Docker chạy hoàn hảo trên cả 3 nền tảng linux, window và mac.
Trong đó cài đặt trên mac là dễ nhất nên chúng ta sẽ bắt đầu với
mac.
Cài đặt trên mac
• B1 : Vào trang tải chính thức
https://www.docker.com/products/docker-desktop và ấn vào
download cho mac.
• B2 : Bạn sẽ nhận được 1 tệp Apple Disk Image và bên trong sẽ có
ứng dụng, kéo tệp và thả nó vào thư mục Applications của bạn.
• B3: Để khởi động nhấn đúp vào biểu tượng docker xuất hiện trên
thanh menu. Sau đó mở terminal, chạy lệnh docker –version và
docker-compose –version để đảm bảo quá trình cài đã thành công.
Cài đặt trên window
Quá trình gần giống như trên Mac. Tuy nhiên cần có thêm 1 vài bước như
sau :
B1: Điều hướng đến trang này https://
docs.microsoft.com/en-us/windows/wsl/install-win10 và làm theo hướng
dẫn để cài WSL2 .
B2 : Chuyển đến trang https://www.docker.com/products/docker-desktop
và chọn download for windows. Sau đó cài đặt các bước mặc định.
B3 : Sau khi cài đặt, khởi động docker từ start menu hoặc desktop. Thực
thi lệnh docker --version và docker-compose –version trên cmd hoặc
powershell để đảm bảo quá trình cài đặt đã thành công.
Cài đặt docker trên linux
Cài đặt trên linux không thể nhận nguyên cả gói 1 lần mà cần cài đặt thủ công. Quy trình
như sau:
- Nếu sử dụng Ubuntu bạn có thể cài từ link https://docs.docker.com/engine/install/ubuntu/
- Với các bản phân phối khác cũng đều có sẵn trên link
https://docs.docker.com/engine/install/
- Bất kể bạn làm theo quy trình nào vẫn sẽ phải trải qua 1 số bước hậu cài đặt cho linux
https://docs.docker.com/engine/install/linux-postinstall/
- Sau khi cài đặt docker, bạn phải cài thêm 1 công cụ tên là Docker Compose từ link
https://docs.docker.com/compose/install/
- Sau khi hoàn tất mở terminal lên và chạy lệnh docker --version và docker-compose –
version để đảm bảo quá trình cài đặt đã xong
1 số câu lệnh thường dùng với docker
• docker ps : Dùng để liệt kê ra các container đang chạy. Khi sử dụng
với các tham số -a/-all: Liệt kê tất cả các container, kể cả đang chạy
hay đã kể thúc -q/-quiet: chỉ liệt kê ra id của các container.
• docker pull : Để tải một image cụ thể hoặc một tập hợp image ta dùng
docker pull.
• docker build : Lệnh này dùng để build một image từ Dockerfile và
context. Ta có thể sử dụng thêm tham số -t để gắn nhãn cho image.
• docker run : Lệnh này dùng để chạy một container dựa trên một
image mà ta có sẵn. Ta có thể thêm vào sau lệnh này một vài câu lệnh
khác như -it bash để chạy bash từ container này.
1 số câu lệnh thường dùng với docker
• docker logs : Lệnh này được sử dụng để hiển thị logs của một container, ta
cần phải chỉ rõ container để hiển thị logs thông qua tên của nó. Ngoài cũng
có thể sử dụng thêm một số flag như --follow để giữ việc theo dõi logs.
• docker volume ls : Lệnh này dùng để liệt kê ra các volumn mà các
container sử dụng, volume là một cơ chế dùng để lưu trữ dữ liệu sinh ra và
sử dụng bởi Docker.
• docker rm : Lệnh này dùng để xóa một hoặc nhiều container.
• docker rmi : Lệnh này dùng để xóa một hoặc nhiều images.
• docker stop : Lệnh này dùng để stop một hoặc nhiều container. Ngoài ra
ta có thể dung docker kill để bắt buộc container dừng lại.
Thank you for listening

You might also like