Docker là một nền tảng mã nguồn mở giúp chúng ta tạo một môi trưởng ảo hoá nhẹ để chạy các ứng dụng, các dịch vụ, với mục tiêu là đưa các ứng dụng dịch vụ đó cài đặt lên một máy chủ khác để triển khai cho người dùng

Tags: #docker, #dev-ops

Docker là gì?

Docker là một nền tảng mã nguồn mở giúp chúng ta tạo một môi trưởng ảo hoá nhẹ để chạy các ứng dụng, các dịch vụ, với mục tiêu là đưa các ứng dụng dịch vụ đó cài đặt lên một máy chủ khác để triển khai cho người dùng.

Để mình lấy ví dụ về một app shop bán hàng viết bằng Python. Sau khi bạn viết xong mã nguồn, chương trình đã chạy được trên máy tính của bạn, tiếp đến, bạn cần đưa mã nguồn máy chủ và triển khai nó cho người dùng.

Trong quá trình triển khai, chạy mã nguồn cho người dùng sử dụng và truy cập được vào trang web, bạn cần cài đặt đúng phiển bản Python, các thư viện liên quan, chỉnh sửa các config và nhiều thứ khác.

Nhiều lúc, bạn sẽ gặp tình trạng là chương trình chạy được trên máy tính cá nhân của bạn, nhưng lại không chạy được trên máy chủ. Thậm chí, chạy được trên máy chủ này mà không chạy được trên máy chủ khác, có thể vì hệ điều hành khác nhau, môi trường thực thi khác nhau.

Lúc này Docker rất thực sự giúp ích rất nhiều. Nó giúp bạn tạo một môi trường ảo đồng nhất, bạn có thể quyết định được phiên bản Python này được cài đặt, hệ điều hành hỗ trợ là gì, và tự động cài đặt các thư viện cần thiết.

Các cài đặt này hoàn toàn độc lập với môi trường thật. Chẳng hạn, hệ điều hành của máy chủ là CentOS, cài Python 3.5, thì bạn có thể setup docker với hệ điều hành là Ubuntu và Python 3.9. Môi trường docker hoàn toàn độc lập với môi trường trên máy tính thật.

Vì sao cần dùng docker

Tiết kiệm tài nguyên: Mỗi container chỉ chứa những thành phần cần thiết cho ứng dụng, không cần cài đặt hệ điều hành đầy đủ. Do đó, container chiếm ít dung lượng và khởi động nhanh hơn máy ảo.
Dễ dàng triển khai: Docker cho phép đóng gói ứng dụng và các phụ thuộc của nó vào một file duy nhất, gọi là image. Image có thể được chia sẻ và sử dụng trên nhiều máy tính khác nhau, đảm bảo tính nhất quán và khả năng tương thích của ứng dụng. Có nghĩa là file image docker hoạt động được trên máy bạn thì nó sẽ cũng hoạt động tốt trên máy tính khác. Ngoài ra, docker còn cung cấp một nền tảng lưu trữ và phân phối image miễn phí, gọi là docker hub, giúp bạn dễ dàng tìm kiếm và tải về các image có sẵn hoặc tạo ra image của riêng bạn.
Linh hoạt và mở rộng: Docker hỗ trợ kết hợp nhiều container để tạo ra các ứng dụng phức tạp, gọi là docker-compose. Docker cũng cho phép tăng hoặc giảm số lượng container theo nhu cầu, gọi là docker-swarm. Nhờ vậy, docker giúp cải thiện hiệu năng và khả năng mở rộng của ứng dụng.

Cấu trúc hoạt động của docker

Docker gồm có ba thành phần chính: Docker Engine, Docker Registry và Docker Compose.

Docker Engine là trái tim của Docker, nó là một tiến trình chạy trên máy chủ của bạn, có nhiệm vụ tạo ra và quản lý các container. Docker Engine giao tiếp với Docker Registry để lấy hoặc đẩy các image, là các bản mẫu để tạo ra các container. Docker Engine cũng giao tiếp với Docker Compose để sử dụng các file cấu hình để định nghĩa và khởi chạy các ứng dụng đa container.
Docker Registry là nơi lưu trữ các image của Docker. Bạn có thể sử dụng Docker Registry công cộng như Docker Hub, hoặc tự xây dựng Docker Registry riêng của mình. Docker Registry cho phép bạn chia sẻ và tái sử dụng các image giữa các máy chủ khác nhau.
Docker Compose là một công cụ giúp bạn định nghĩa và khởi chạy các ứng dụng đa container bằng cách sử dụng các file YAML. Bạn có thể chỉ định các thuộc tính của các container như tên, image, port, volume, network, dependency, v.v. và sau đó sử dụng một lệnh duy nhất để tạo và chạy tất cả các container cần thiết cho ứng dụng của bạn.

Những khái niệm cơ bản khác của docker

Images: là môt filesystem chứa mọi thứ cần thiết để chạy một ứng dụng - tất cả các thư viện, cấu hình, script, binary program, v.v. Image cũng chứa các cấu hình khác cho container, chẳng hạn như biến môi trường, lệnh mặc định để chạy và các metadata khác.
Container: là trạng thái đang chạy của các image. Chúng bao gồm ứng dụng và các thành phần liên quan, chạy trong các môi trường cô lập trên máy chủ. Mỗi container chia sẻ cùng một kernel nhưng hoạt động trong không gian người dùng cô lập, đảm bảo rằng ứng dụng chạy nhất quán trên các môi trường khác nhau.
Dockerfile: là một tệp văn bản chứa một tập hợp các hướng dẫn để xây dựng một docker image. Nó xác định các bước cần thiết để tạo image, như là cài hệ điều hành, chạy các lệnh như nào, mở các port nào, v,v.

Thực hành

Trong phần thực hành này, chúng ta sẽ tạo một docker image để chạy một đứng dụng todo-list. Ứng dụng này được lập trình bằng NodeJS. Tuy nhiên nếu bạn không rành về NodeJS thì cũng không sao, vì bài viết tập trung vào công nghệ docker, không phải về lập trình.

Yêu cầu

1.Đã đặt phiên bản Docker mới nhất tại đây: Docker Desktop
2.Đã cài đặt git: Git client
3.Chúng tôi khuyến khích bạn cài đặt Visual Studio Code để chỉnh sửa code.

Tải mã muồn của ứng dụng về

Ứng dụng này đã được viết sẵn, bạn chỉ cần clone về máy tính của mình:

Dưới dây là danh sách nhưng file và folder trong mã nguồn mà bạn đã clone về:

Tạo image cho ứng dụng này

Trong thư mục getting-started-app, cùng vị trí với tệp package.json, tạo một tệp có tên Dockerfile. Bạn có thể sử dụng các lệnh sau để tạo một Dockerfile dựa trên hệ điều hành Linux/Mac.

Tiếp theo, tạo một file Dockerfile có nội dung như sau:

Chạy các lệnh sau để tạo image cho ứng dụng:

Lệnh docker build sử dụng Dockerfile để xây dựng một image mới. Bạn có thể đã nhận thấy rằng Docker đã tải về rất nhiều “layer”. Điều này là do bạn đã hướng dẫn trình xây dựng rằng bạn muốn bắt đầu từ image node:18-alpine. Nhưng, vì bạn không có image đó trên máy của bạn, Docker cần phải tải xuống.

Sau khi Docker tải xuống image, các hướng dẫn từ Dockerfile đã sao chép ứng dụng của bạn và sử dụng yarn để cài đặt các dependency của ứng dụng.

Lệnh CMD chỉ định lệnh mặc định để chạy khi bắt đầu một container từ image này.

Cuối cùng, flag -t gắn thẻ image của bạn. Hãy nghĩ đây là một tên dễ đọc cho người của image cuối cùng. Vì bạn đã đặt tên image là getting-started, bạn có thể tham chiếu đến image đó khi bạn chạy một container. Dấu chấm ở cuối lệnh docker build nói với Docker rằng nó nên tìm kiếm Dockerfile trong thư mục hiện tại.

Chạy một ứng dụng trong container

Sau khi bạn đã có một image, bạn có thể chạy ứng dụng trong một container bằng lệnh docker run.Chạy container của bạn bằng lệnh docker run và chỉ định tên của image bạn vừa tạo:

Flag -d (viết tắt của --detach) chạy container ở chế độ nền. Điều này có nghĩa là Docker khởi động container của bạn và trả lại bạn cho dấu nhắc lệnh.
Flag -p (viết tắt của --publish) tạo một ánh xạ cổng giữa host và container. Flag -p nhận một giá trị chuỗi theo định dạng HOST:CONTAINER, trong đó HOST là địa chỉ trên máy chủ, và CONTAINER là cổng trên container. Không có ánh xạ cổng, bạn sẽ không thể truy cập ứng dụng từ máy thật.Trong ví dụ này, cổng 3000 của container sẽ được ánh xạ để cổng 3000 trên máy thật. Có nghĩa là mọi kết nối để cổng 3000 trên máy thật sẽ được gửi đển cổng 3000 của container.
getting-started: Đây là tên của image Docker mà bạn muốn khởi chạy thành một container.

Nếu có khó khăn hãy đặt câu hỏi cho nhóm Sydexa tại group facebook này nhé.

SYDEXA
We learn, we share, we grow together!

About

  • Sydexa

Resources

  • Docs
  • Sydexa Hub

Contact

  • For Work
  • Report

Members

  • Sign in
  • Sign up
  • Portal
@ Sydexa 2024. All copyrights reserved