[Docker] Chapter 1: Docker là gì?

  • Kai
  • January 24, 2021

Docker là một nền tảng mã nguồn mở dùng để phát triển, vận chuyển và chạy các ứng dụng. Docker cho phép bạn tách biệt ứng dụng của bạn khỏi cơ sở hạ tầng để bạn có thể triển khai phần mềm một cách nhanh chóng. Với Docker, bạn có thể quản lý cơ sở hạ tầng của mình theo cách tương tự như bạn quản lý các ứng dụng. Bằng cách áp dụng các phương pháp của Docker để vận chuyển, kiểm thử và triển khai mã nguồn, bạn có thể giảm thiểu đáng kể thời gian từ khi viết mã đến khi chạy ứng dụng trong môi trường sản xuất.

The Docker platform

Docker cung cấp khả năng đóng gói và chạy ứng dụng trong một môi trường cô lập gọi là container. Sự cô lập và bảo mật cho phép bạn chạy nhiều container đồng thời trên một máy chủ cụ thể. Các container nhẹ và chứa đầy đủ mọi thứ cần thiết để chạy ứng dụng, do đó bạn không cần phải dựa vào những gì đã cài đặt trên máy chủ. Bạn có thể chia sẻ các container trong quá trình làm việc và đảm bảo rằng mọi người bạn chia sẻ đều nhận được cùng một container hoạt động theo cùng một cách.

Docker cung cấp các công cụ và nền tảng để quản lý vòng đời của các container của bạn:

  • Phát triển ứng dụng và các thành phần hỗ trợ của nó bằng cách sử dụng các container.
  • Container trở thành đơn vị để phân phối và kiểm thử ứng dụng của bạn.
  • Khi bạn sẵn sàng, triển khai ứng dụng của bạn vào môi trường sản xuất, dưới dạng một container hoặc dịch vụ được điều phối. Điều này hoạt động tương tự cho dù môi trường sản xuất của bạn là một trung tâm dữ liệu địa phương, một nhà cung cấp đám mây, hoặc một kết hợp của cả hai.

Docker có thể làm gì?

Triển khai ứng dụng nhanh chóng và nhất quán

Docker đơn giản hóa quá trình phát triển bằng cách cho phép các nhà phát triển làm việc trong môi trường chuẩn hóa bằng các container local. Các container bao gồm các ứng dụng và dịch vụ, làm cho chúng lý tưởng cho quy trình làm việc liên tục tích hợp và liên tục triển khai (CI/CD).

Ví dụ minh họa:

  • Các nhà phát triển viết mã code tại local và chia sẻ công việc của họ thông qua Docker containers.
  • Họ sử dụng Docker để triển khai ứng dụng vào môi trường thử nghiệm để thực hiện kiểm thử tự động và thủ công.
  • Khi phát hiện lỗi, các nhà phát triển sửa chữa trong môi trường phát triển và triển khai lại vào môi trường thử nghiệm để kiểm tra và xác nhận.
  • Khi hoàn thành kiểm thử, các bản cập nhật được đẩy lên môi trường sản xuất một cách dễ dàng.
Triển khai và mở rộng linh hoạt

Nền tảng dựa trên container của Docker đảm bảo khả năng di chuyển các tải động làm việc một cách dễ dàng. Các container Docker hoạt động một cách nhất quán trên laptop của nhà phát triển, các máy chủ vật lý hoặc ảo trong trung tâm dữ liệu, và các môi trường đám mây khác nhau.

Lợi ích chính:

  • Di động: Các container Docker chạy một cách nhất quán trên các môi trường đa dạng.
  • Mở rộng: Dễ dàng mở rộng ứng dụng lên hoặc giảm thiểu dựa trên nhu cầu kinh doanh trong thời gian thực.
Tối ưu hóa sử dụng tài nguyên hiệu quả

Thiết kế nhẹ của Docker cung cấp một giải pháp tiết kiệm chi phí so với các máy ảo dựa trên hypervisor truyền thống. Điều này giúp tối đa hóa khả năng của máy chủ, phù hợp với các môi trường có mật độ cao và triển khai vừa và nhỏ.

Lợi ích:

  • Hiệu quả chi phí: Sử dụng tài nguyên máy chủ một cách hiệu quả.
  • Linh hoạt: Lựa chọn lý tưởng cho môi trường yêu cầu quản lý tài nguyên tối ưu.

Docker giúp các nhóm công việc tối ưu hóa quy trình phát triển, triển khai và mở rộng, nâng cao hiệu quả và sự linh hoạt trong việc triển khai phần mềm.

Kiến trúc và các thành phần cơ bản của Docker

alter-text
Kiến trúc của Docker.
Kiến trúc Client-Server

Docker sử dụng một kiến trúc client-server. Docker client giao tiếp với Docker daemon (dockerd), nơi thực hiện các công việc chủ yếu như xây dựng, chạy và phân phối các container Docker. Docker client và daemon có thể chạy trên cùng một hệ thống hoặc bạn có thể kết nối Docker client với một Docker daemon từ xa. Giao tiếp giữa Docker client và daemon được thực hiện qua REST API, qua socket UNIX hoặc giao diện mạng.

Docker Daemon

Docker daemon (dockerd) lắng nghe các yêu cầu API Docker và quản lý các đối tượng Docker như images, containers, networks, và volumes. Một daemon có thể giao tiếp với các daemon khác để quản lý các dịch vụ Docker.

Docker Client

Docker client (docker) là cách chính mà nhiều người dùng Docker tương tác với Docker. Khi bạn sử dụng các lệnh như docker run, client gửi các lệnh này đến dockerd để thực hiện. Docker client sử dụng Docker API và có thể giao tiếp với nhiều hơn một daemon.

Docker Desktop

Docker Desktop là một ứng dụng dễ cài đặt cho các môi trường Mac, Windows hoặc Linux, giúp bạn xây dựng và chia sẻ các ứng dụng và dịch vụ microservices trong container. Docker Desktop bao gồm Docker daemon (dockerd), Docker client (docker), Docker Compose, Docker Content Trust, Kubernetes, và Credential Helper. Để biết thêm thông tin, bạn có thể xem tại Docker Desktop .

Các đối tượng Docker
Images

Một image là một mẫu chỉ đọc với các hướng dẫn để tạo một container Docker. Bạn có thể xây dựng image của riêng mình bằng cách sử dụng Dockerfile để định nghĩa các bước cần thiết. Mỗi hướng dẫn trong Dockerfile tạo ra một layer trong image. Các image Docker rất nhẹ, nhỏ gọn và nhanh chóng so với các công nghệ ảo hóa khác.

Containers

Một container là một phiên bản chạy của một image. Bạn có thể tạo, khởi động, dừng, di chuyển hoặc xóa container bằng Docker API hoặc CLI. Một container mặc định được cách ly khá tốt so với các container khác và máy chủ chủ. Bạn có thể điều khiển mức độ cách ly của mạng, lưu trữ hoặc các hệ thống phụ thuộc khác của container.

Registries Docker

Một registry Docker lưu trữ các image Docker. Docker Hub là một registry công cộng mà bất kỳ ai cũng có thể sử dụng và Docker tìm kiếm các image trên Docker Hub mặc định. Bạn cũng có thể chạy registry riêng của mình.

Ví dụ về lệnh docker run

Bạn có thể sử dụng lệnh sau để chạy một container ubuntu, kết nối tương tác với phiên dòng lệnh local và thực thi /bin/bash.

docker run -i -t ubuntu /bin/bash

Khi bạn chạy lệnh này, các bước sau sẽ xảy ra (giả sử bạn đang sử dụng cấu hình registry mặc định):

  1. Pull image Ubuntu từ registry: Nếu bạn chưa có image Ubuntu trên máy local, Docker sẽ kéo image này từ registry đã cấu hình, tương tự như bạn đã chạy docker pull ubuntu thủ công.

  2. Tạo container mới: Docker tạo một container mới, như thể bạn đã chạy lệnh docker container create thủ công.

  3. Cấp phát filesystem cho container: Docker cấp phát một filesystem có thể ghi cho container, là lớp cuối cùng của nó. Điều này cho phép một container đang chạy tạo hoặc sửa đổi các tệp và thư mục trong filesystem local của nó.

  4. Tạo giao diện mạng: Docker tạo một giao diện mạng để kết nối container với mạng mặc định, vì bạn không chỉ định bất kỳ tùy chọn mạng nào. Điều này bao gồm việc gán địa chỉ IP cho container. Mặc định, các container có thể kết nối với mạng ngoài sử dụng kết nối mạng của máy chủ.

  5. Khởi động và thực thi lệnh /bin/bash: Docker khởi động container và thực thi lệnh /bin/bash. Vì container đang chạy tương tác và được gắn vào terminal của bạn (nhờ các cờ -i-t), bạn có thể nhập dữ liệu bằng bàn phím trong khi Docker ghi lại kết quả ra terminal của bạn.

Khi bạn chạy exit để kết thúc lệnh /bin/bash, container sẽ dừng nhưng không bị xóa. Bạn có thể khởi động lại hoặc xóa container khi cần thiết.

Công nghệ cơ bản

Docker được viết bằng ngôn ngữ lập trình Go và tận dụng nhiều tính năng của nhân Linux để cung cấp các chức năng của nó. Docker sử dụng một công nghệ gọi là “namespaces” để cung cấp không gian làm việc cô lập được gọi là container. Khi bạn chạy một container, Docker tạo ra một tập hợp các namespaces cho container đó.

Các namespaces này cung cấp một lớp cách ly. Mỗi khía cạnh của một container chạy trong một namespace riêng biệt và quyền truy cập của nó được giới hạn trong namespace đó.

Bài viết được dịch và tham khảo tại đây .

Bài Viết Liên Quan

[AWS] Chapter 13: AWS CloudFront

  • Kai
  • August 28, 2024

Xin chào các bạn, trong bài blogs này chúng ta sẽ tìm hiểu về AWS CloudFront, một dịch vụ CDN (Content Delivery Network) của AWS.

Đọc Thêm

[AWS] Chapter 12: AWS S3 Hands On

  • Kai
  • August 27, 2024

Xin chào tất cả các bạn, trong bài blogs này, chúng ta sẽ thực hành về AWS S3 nhé. Let’s go!

Đọc Thêm

[AWS] Chapter 11: AWS S3 Advanced (Phần 2)

  • Kai
  • August 26, 2024

Xin chào tất cả các bạn, lại là mình đây. Trong bài blogs này, chúng ta sẽ tiếp tục tìm hiểu về những tính năng nâng cao của AWS S3.

Đọc Thêm