Professional Documents
Culture Documents
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ì?
• 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
• 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 ?
• 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?
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.
• 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.
• 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).
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.
• 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.
• 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