Docker là gì? Hướng dẫn chi tiết cách sử dụng Docker

0
1860

Nếu bạn đang đọc bài viết này chắc hẳn là bạn đang tìm hiểu coi Docker là gì, nó có công dụng gì, cũng như cách dùng nó như thế nào. Nếu đúng như vậy thì mình sẽ không để bạn thất vọng đâu. Bài viết này Lập Trình Không Khó sẽ hướng dẫn những kiến thức cơ bản nhất Docker. Mình sẽ cố gắng trình bày sao cho chi tiết và mạch lạc nhất có thể. Chắc chắn nó sẽ giúp bạn có một cái nhìn sâu sắc nhất về cái thứ đang làm bạn mông lung này.

Docker là gì?

Docker là một dự án mã nguồn mở (open source) giúp quá trình triển khai (deploy) các ứng dụng, phần mềm trên các hệ điều hành Windows hoặc Linux trở nên đơn giản “giống như copy – paste”. Nói một cách dễ hơn hơn, docker mô phỏng một hệ điều hành Linux nơi nó chứa tất cả các môi trường dành cho dự án của bạn, hơn hết là nó đủ nhỏ bé để bạn có thể chia sẻ và nhân bản một cách dễ dàng.

Docker là gì

Tại sao nên sử dụng Docker

Lấy ví dụ team bạn được giao một dự án mới hay ho, dự án này cần sử dụng một thư viện mã nguồn mở X trên Github.

Ồ, bạn biết ngay việc đầu tiên sẽ phải làm là gì rồi đúng không? Giờ mình sẽ cần cài đặt cái thư viện mã nguồn mở X kia lên máy để sử dụng cho dự án mới hay ho của mình.

Nào, mở README.md lên và xem cách cài đặt cái thư viện nguồn mở X ra làm sao. Nhưng không, đập vào mắt bạn là cả tá các dependencies cần cài. Nào là cmake, g++, cuda, glog, intel mkl,… Bạn cứ hình dùng là một tá (rất nhiều) các thư viện khác cần cài.

- Bài viết liên quan dành cho bạn -

Khi đó bạn chắc mẩm, chắc phải mất buổi sáng để cài được cái thư viện X này quá. Bạn loay hoay đi cài từng thằng một và khi chỉ còn 2 thư viện nữa là xong thì terminal xuất hiện một màu đỏ lòm báo lỗi không tương thích phiên bản 🙁

Docker là gì? Hướng dẫn chi tiết cách sử dụng Docker 1

Ngồi google không ra lỗi tại sao, bởi vì chúng toàn là các thư viện C++. Bạn nào từng cài các mã nguồn mở lớn dùng C++ chắc sẽ hiểu. Loay hoay đến cả ngày trời rồi vẫn không thể tìm ra cách khắc phục.

Docker là gì? Hướng dẫn chi tiết cách sử dụng Docker 2

Giờ nên làm gì nhỉ, thôi thử lại lần nữa biết đâu hên thì sao !!!…

Và phần kết của câu chuyện mình muốn nhắc tới Docker. Lấy ví dụ một thư viện mã nguồn mở xử lý tiếng nói của ông trùm Facebook wave2letter được viết bằng mã nguồn C++. Bạn sẽ có 2 lựa chọn: (1) hoặc là tự cài hết mọi thứ, hoặc (2) kéo docker của họ đã chia sẻ trên DockerHub về là sử dụng được luôn.

Có thể bạn quan tâm: 20+ linux command hữu ích dành cho Data Scientist

Trước khi có Containerization

Vì Docker là một nền tảng container ảo hóa, nên trước khi đi tìm hiểu nó, chúng ta cùng tìm hiểu lịch sử phát triển một chút nhé.

Thời kỳ đầu, cách triển khai các ứng dụng của chúng ta hết sức đơn giản. Cho một máy tính chạy hệ điều hành phù hợp, cài đặt các dependencies lên và sau đó cho ứng dụng chạy trên đó. Nó chính là cách mà chúng ta vẫn xây dựng các mini project trên trường học đó.

Sang giai đoạn tiến bộ hơn, trước khi có xuất hiện của Containerization, phương pháp phổ biến nhất để cô lập, tổ chức các ứng dụng và dependencies của ứng dụng là ném chúng nó vào một con máy ảo (virtual machine). Những cái máy ảo này sẽ chạy rất nhiều ứng dụng trên cùng một phần cứng vật lý. Đại diện cho giai đoạn rực rỡ này có thể kể tên 2 phần mềm mà có lẽ nhiều bạn đã dùng, đó là VMWaveVirtualbox. Nó được gọi là công nghệ ảo hóa (virtualization).

Sự khác nhau giữa virtualization vs containerization
Sự khác nhau giữa 2 công nghệ Virtualization (trái) và Containerization (phải)

Nhưng công nghệ ảo hóa có một số nhược điểm như là:

  • Máy ảo có kích thước khá lớn, cài đặt cồng kềnh hơn.
  • Khi đã bật máy ảo, nó sẽ chiếm đoạt 1 lượng tài nguyên của máy chủ, ngay cả khi nó không dùng được hết. Chẳng hạn như bạn tạo con máy ảo dùng 2GB ram, trong suốt quá trình hoạt động của máy ảo, dù nó chỉ dùng 1GB ram thì máy vật lý của bạn vẫn sẽ mất 2GB ram rồi.
  • Quá trình khởi động máy ảo khá lâu.

Từ những hạn chế và yếu điểm của Virtualization dẫn đến sự ra đời của Containerization.

Với sự ra đời của Containerization, trên một máy chủ vật lý ta có thể cài đặt nhiều container tương tự như các máy ảo của công nghệ Virtualization. Nhưng điểm khác biệt ở đây là (xem ảnh phía trên):

  • Các container không có hệ điều hành khách (Guest OS) như máy ảo. Tất cả các container sẽ sử dụng OS của máy mẹ. Do đó, chúng sẽ chia sẻ các thư viện và tài nguyên có liên quan khi cần thiết.
  • Thời gian  xử lý và thực thi các ứng dụng nhanh, do các tài nguyên của các máy ảo này đều được chạy trên nhân hệ điều hành của máy mẹ.
  • Thời gian khởi động container nhanh, cỡ mili giây. Kích thước các container này cũng nhỏ hơn rất nhiều so với máy ảo của Virtualization.

Tìm hiểu chi tiết về Docker

Trong phần này, chúng ta sẽ cùng nhau tìm hiểu các khái niệm cơ bản nhất về Docker. Bao gồm các khái niệm về Dockerfile, Image và Container,…

Dockerfile, Images và Containers

Dockerfile, Images và Containers là 3 thuật ngữ quan trọng mà bạn cần phải hiểu rõ khi sử dụng Docker.

Dockerfile, Images & Containers
Dockerfile, Images và Containers

Như bạn có thể thấy trong bức hình trên. Khi dockerfile được build thì nó sẽ trở thành Docker image. Và khi bạn chạy file Docker image -> nó sẽ trở thành một Container.

Dockerfile là gì?

Dockerfile là một tài liệu nơi chưa tất cả những câu lệnh mà người dùng có thể gọi từ Command line để build ra một Docker image. Do đó, Docker có thể tự động build ra image dựa theo chỉ dẫn của Dockerfile. Câu lệnh docker build cho phép bạn thực hiện việc tự động build 1 Docker image từ Dockerfile cho trước.

Docker image là gì?

Docker image có thể coi như là các template của các Docker container. Từ template này, chúng ta có thể tạo ra các Docker container giống nhau. Chúng là các file chỉ đọc, từ các file này bạn có thể tạo ra các Docker container bằng cách thực thi câu lệnh docker run.

Docker image có thể được chia sẻ lên công khai trên Docker Hub (Nơi chia sẻ docker image) để mọi người có thể cùng phát triển và sử dụng.

Docker container là gì?

Nó là một phiên bản thực thi của Docker Image khi nó giữ toàn bộ các gói (package) cần thiết để chạy ứng dụng. Vì vậy, về cơ bản, có thể coi đây là các ứng dụng đã sẵn sàng được tạo từ Docker Images.

Đây chính là một ưu điểm vượt trội của Docker mà bạn đang mong chờ đúng không? Giờ thì chúng ta đi vào thực hành nhé.

Có thể bạn quan tâm: Tự xây dựng hệ thống chặn bình luận rác đơn giản

Tạo docker image của riêng bạn

Trước tiên, mình sẽ cài đặt Docker CE (Community Edition) trên con máy Ubuntu 18.04 của mình. Do đó, chúng ta sẽ cài theo hướng dẫn chi tiết đã có ở đây. Bạn có thể xem hướng dẫn cho OS của bạn nhé.

Và đây là kết quả sau khi cài thành công! Check luôn xem nó cài version mới nhất là version bao nhiêu.

Bây giờ chúng ta sẽ cùng nhau đi tạo 1 cái Docker image nhé. Mình sẽ tạo một Docker image cho source code trang demo crawler website tin tức. Nếu bạn chưa biết nó là gì thì có thể trải nghiệm trước ở đây trước khi vào việc nhé.

1. Đầu tiên, mình sẽ tạo một thư mục news-crawler để làm việc cho tiện

Do con news-crawler (Github repo) này của mình là một service chạy bằng Python 3, và yêu cầu một số package thì mình đã để trong file requirements.txt rồi. Nên mình sẽ vào việc luôn nhé.

2. Tạo file Dockerfile chứa các chỉ dẫn cho Docker image, bạn có thể sử dụng editor bất kỳ để sửa đổi nội dung này nhé, vim editor chẳng hạn:

Mình sẽ giải thích một xíu các dòng có trong cái file Dockerfile này:

  • FROM: Mình sẽ lấy file Docker image ubuntu bản 18.04 trên Docker Hub về dùng.
  • MAINTAINER: Thông tin chủ sở hữu 🙂
  • RUN: phía sau nó là một command, chỉ dẫn cho quá trình build biết nó phải chạy câu lệnh gì. Ở đây mình cài python3.6 và git để phục vụ việc clone code từ Github về và chạy code thôi.
  • WORKDIR: Khai báo thư mục làm việc. Do code của mình ở trong thư mục app sau khi clone về nên mình cần khai báo.
  • EXPOSE: Flask app của mình chạy ở port 5001 (Xem trong app.py của repo), do đó mình báo cho Container nó biết để sau này nó mở port này ra, sau đó ta có thể ánh xạ nó với một port nào đó của máy vật lý.
  • ENTRYPOINT và CMD: Chỉ định thực thi một câu lệnh executable. Ở đây là python app.py

Tóm tắt: Dockerfile trên dựa trên một Docker image ubuntu 18.04, sau đó mình bảo nó cần cài thêm python==3.6 và git. Tiếp theo, clone git repo về, chạy vào thư mục source code và cài đặt các package python cần thiết. Cuối cùng là chạy chương trình.

3. Build dockerfile để tạo Docker image thì chúng ta dùng command docker build thôi. Cái tham số tag bạn có thể thay đổi nhé. Sau khi thành công thì chúng ta có 2 dòng log như 2 dòng cuối cùng.

4. Tạo container từ Docker image đã build

Thử xem Docker image mình build có hoạt động không chứ nhỉ 🙂 Dùng docker run để tạo container thôi.

Command phía trên có tham số --name chỉ định tên của container mà chúng ta sẽ run (tên không được trùng với các container đã có). -p báo cho máy của mình biết là sẽ map port 5001 của container sang port 9000 của laptop của mình. Còn news-crawler ở cuối câu lệnh là tên của image mà bạn sẽ run.

Và giờ thì mình có thể vào từ trình duyệt qua địa chỉ http://localhost:9000/ để sử dụng ứng dụng rồi.

Kết quả quá trình thực hành với Docker
Kết quả quá trình thực hành với Docker

Lưu ý: Trong hướng dẫn này, ứng dụng Flask này vẫn đang chạy ở chế độ nhà phát triển (Development). Nếu bản sử dụng cho mục đích triển khai (Production), bạn nên làm theo hướng dẫn kèm theo của Flask tại đây.

5. Kiểm tra docker image đã có trong danh sách. Và khi bạn đã có docker image rồi thì bạn cũng có thể chia sẻ nó lên Docker hub như ai đó luôn rồi nha.

Và đây là Docker image của mình sau khi chia sẻ lên Docker hub: https://hub.docker.com/r/hieunv1996/news-crawler

Docker là gì? Hướng dẫn chi tiết cách sử dụng Docker 3

Bài viết của mình dài quá, hi vọng nó giúp ích được cho các bạn nhiều! Tuy nhiên đó vẫn chưa phải tất cả về Docker đâu, mong rằng bài viết sẽ cho bạn 1 cái nhìn cơ bản nhất về Docker và tiếp tục đào sâu về nó.

Dưới đây là một số tài liệu mình tham khảo trong quá trình viết bài. Đó cũng là những tài liệu bổ ích phục vụ cho việc tìm hiểu về docker của bạn luôn!

Tài liệu tham khảo:

  1. https://docs.docker.com/
  2. https://www.edureka.co/blog/docker-explained/
Subscribe
Notify of
guest
0 Bình luận
Inline Feedbacks
View all comments