Kiến thức cơ bản về docker

Tại sao phải dùng Docker ?

Việc setup và deploy application lên một hoặc nhiều server rất vất vả từ việc phải cài đặt các công cụ, môi trường cần cho application đến việc chạy được ứng dụng chưa kể việc không đồng nhất giữa các môi trường trên nhiều server khác nhau. Chính vì lý do đó Docker được ra đời để giải quyết vấn đề này.

Docker là gì

Docker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hóa. Docker cung cấp một lớp trừu tượng và tự động ảo hóa dựa trên LinuxDocker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hóa. Docker cung cấp một lớp trừu tượng và tự động ảo hóa dựa trên Linux.

-> Định nghĩa theo cách đơn giản hơn: Docker là công cụ giúp ta có thể chạy project ở một môi trường cụ thể, được định sẵn rõ ràng, độc lập với môi trường gốc. Các ứng dụng chạy trong Docker được gọi là các Container.

Những điều Docker mang lại

  1. Docker cho các bạn 1 môi trường mục tiêu cụ thể, ví dụ các bạn cần môi trường Ubuntu, có PHP 7.2 có NodeJS 8.0, có mysql 5.2. Docker sẽ giúp bạn có được điều đó.
  2. Môi trường trong Docker độc lập so với môi trường gốc: Docker sẽ tạo ra cho các bạn môi trường "ảo" trong đó các bạn có thể chạy project của mình, bất kể hệ điều hành gốc của các bạn có là gì. Do đó, kể cả bạn ở Win hay Mac thì vẫn có thể chạy project dưới môi trường Ubuntu hay bất cứ môi trường nào (mà hiện tại Docker support) bạn cần.
  3. Một môi trường Docker sau khi được định nghĩa nó sẽ là "bất biến". Bạn có thể setup ở bất kì đâu bất kì máy nào với môi trường giống hệt bạn đã định nghĩa.
  4. Mỗi một project sẽ có một file cấu hình cụ thể, 10 năm sau bạn đọc lại project thì vẫn biết để chạy được project đó thì cần những gì và cần làm gì. Bạn chỉ cần đưa file cấu hình cho người khác là họ sẽ tự biết phải làm gì để chạy.
  5. Vì mỗi project chúng ta có thể setup ở một môi trường riêng, nên các project sẽ không bị xung đột, chia sẻ tài nguyên lằng nhằng (nếu như ta không muốn). Từ đó giảm thiểu tối đa sự phụ thuộc lẫn nhau, cài đặt, thêm bớt sửa xóa các thư viện, cấu hình cũng sẽ không bị ảnh hưởng tới các project khác.
  6. Docker có thể giúp tự động Heal (tự hồi phục, khởi động lại) nếu trong trường hợp có lỗi.

Các khái niệm cần nắm

Khi nhảy vào Docker sẽ có rất nhiều thứ chúng ta cần biết, nhưng nếu nói ngay trong 1 bài này thì sẽ rất dễ bị loạn. Do đó mình sẽ chỉ đề cập 1 vài khái niệm cơ bản mình thấy là cần thiết và ta hay dùng đến, những điều khác mình sẽ viết ở những bài sau.

Image


Image là 1 trong những đơn vị cơ bản nhất trong Docker. 1 Image sẽ định nghĩa cho 1 môi trường và những thứ có trong môi trường đó. Ứng dụng của ta muốn chạy được thì cần phải có Image

Ví dụ trong Image ta có thể định nghĩa các thành phần như sau:

  • Môi trường: Ubuntu 20.04
  • PHP 7.2
  • MySQL 5.6

Thì toàn bộ những thứ bên trên (Ubuntu, PHP, MySQL) ta có thể đóng gói lại thành 1 Image. Image này có thể đem public cho người khác có thể dùng được.

Container

Một Container là 1 thực thể của Image. Cách hiểu đơn giản nhất đó là: Image các bạn xem như 1 class, còn Container xem như 1 Object được khởi tạo từ class đó.

Từ một Image ta có thể khởi tạo cả chục, trăm container.Mỗi project có thể chứa 1 hoặc nhiều container được tạo ra từ 1 hoặc nhiều image. Ví dụ, ta có project PHP:

  • Môi trường Ubuntu -> cần có image Ubuntu 20.04
  • Có thêm php -> cần có image php7.2

Do đó khi chạy project trên ta sẽ cần tạo 2 container: 1 là container Ubuntu, 1 container PHP7.2

Port (cổng)

Vì môi trường trong Docker độc lập hoàn toàn so với môi trường gốc. Nên để có thể sử dụng được ứng dụng chạy trong Docker thì ta cần mở port từ Docker để bên ngoài có thể gọi vào được.

Hay gọi đúng thì là ta "map port". Tức là ta sẽ mở 1 port ở hệ điều hành gốc, sau đó điều hướng tới port được ở trong Docker. Như thế ta mới có thể gọi đến ứng dụng chạy trong Docker được

Như ở ảnh trên ta có 1 server Tomcat chạy trong 1 container Docker, ở container ta mở port 8080 cho môi trường ngoài truy cập, từ môi trường ngoài ta mở cổng 8888 để user thật có thể truy vấn. Do đó user sẽ gọi đến cổng 8888 để giao tiếp với ứng dụng chạy trong Docker container.

Volume

Vì môi trường Docker độc lập nên hệ thống file của ứng dụng chạy trong Docker cũng độc lập, mà thực tế thì hầu như ta luôn cần lưu lại file: lưu trữ DB, lưu trữ log, ảnh,... Do đó để môi trường gốc truy cập được vào file system của ứng dụng chạy trong Docker thì ta cần tới Volume

Dùng Volume để môi trường gốc có thể nói cho Docker biết rằng: nếu anh có sinh ra file log mới thì anh nhớ lưu cho anh xong thì nhớ tạo 1 "hình chiếu" của file log cho tôi nhé, khi tôi sửa/xóa ở bên tôi (bên ngoài), hoặc anh sửa/xóa ở bên anh thì file log đó đều phải mất ở cả 2 môi trường (gọi đúng thuật ngữ thì là mount từ môi trường ngoài vào trong Docker)

Kết thúc


Bài viết này mình xin góp chút kiến thức nhỏ giới thiệu những kiến thức mình biết về docker. Nếu có điều gì cần góp ý cho mình, anh em vui lòng để lại comment nhé.
Cảm ơn anh em đã dành thời gian đọc bài viết.

Tài liệu tham khảo

https://www.digitalocean.com/community/tutorials/what-is-docker
https://viblo.asia/p/docker-la-gi-kien-thuc-co-ban-ve-docker-maGK7qeelj2